Mercurial > paraspace
annotate examples/inject_redir.py @ 128:b381aa95fbad
Apply array sorting in inject_redir.py
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Mon, 08 Aug 2011 22:48:14 +0800 |
parents | ff6f869273b7 |
children | 044bfc415577 |
rev | line source |
---|---|
119
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
1 ## \file |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
2 # |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
3 # This is an example of inject a class from source to destinate DEX, and |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
4 # rewrite all references of a specified class with the injected one and its |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
5 # methods. All calls of specified class will be redirected to the |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
6 # injected class. |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
7 # |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
8 from paraspace.dexfile import DEXFile, DEXFile_linked |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
9 from paraspace.dex_deptracker import prepare_dep_decls |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
10 from paraspace.dex_deptracker import restore_dependencies |
128
b381aa95fbad
Apply array sorting in inject_redir.py
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
11 from paraspace.dex_deptracker import dex_sort_sorted_arrays |
119
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
12 from paraspace.injection import inject_classdefs, make_methodidxs_redir_map |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
13 from paraspace.injection import dexfile_redirect_types |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
14 import sys |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
15 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
16 if len(sys.argv) != 6: |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
17 print >> sys.stderr, \ |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
18 'usage: %s <src dex> <inject class> ' \ |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
19 '<dst dex> <redirect class> <output>' % \ |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
20 (sys.argv[0]) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
21 sys.exit(1) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
22 pass |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
23 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
24 src_dexname = sys.argv[1] |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
25 inj_classname = sys.argv[2] |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
26 dst_dexname = sys.argv[3] |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
27 redir_classname = sys.argv[4] |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
28 output_name = sys.argv[5] |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
29 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
30 decls = prepare_dep_decls() |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
31 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
32 src_dex = DEXFile.open(src_dexname) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
33 src_linked = DEXFile_linked.build_dependencies(src_dex, decls) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
34 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
35 dst_dex = DEXFile.open(dst_dexname) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
36 dst_linked = DEXFile_linked.build_dependencies(dst_dex, decls) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
37 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
38 inj_classdef = src_linked.find_class_name(inj_classname) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
39 injected_classdefs = inject_classdefs(dst_linked, src_linked, [inj_classdef]) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
40 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
41 redir_typeid = dst_linked.find_typeid_name(redir_classname) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
42 redir_typeidx = dst_linked.get_idx_typeid(redir_typeid) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
43 inj_typeid = dst_linked.find_typeid_name(inj_classname) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
44 inj_typeidx = dst_linked.get_idx_typeid(inj_typeid) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
45 typeidxs_redir = {redir_typeidx: inj_typeidx} |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
46 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
47 methodidxs_redir = \ |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
48 make_methodidxs_redir_map(dst_linked, dst_linked, typeidxs_redir) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
49 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
50 injected_typeidxs = [dst_linked.get_idx_classdef(classdef) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
51 for classdef in injected_classdefs] |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
52 dexfile_redirect_types(dst_linked, typeidxs_redir, methodidxs_redir, |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
53 excludes=injected_typeidxs) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
54 |
128
b381aa95fbad
Apply array sorting in inject_redir.py
Thinker K.F. Li <thinker@codemud.net>
parents:
126
diff
changeset
|
55 dex_sort_sorted_arrays(dst_linked) |
119
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
56 restore_dependencies(dst_linked, decls) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
57 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
58 restore_raw = dst_linked.to_str() |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
59 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
60 ofile = open(output_name, 'w') |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
61 ofile.write(restore_raw) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
62 ofile.close() |