Mercurial > paraspace
annotate examples/inject_redir.py @ 119:4f508f84c8a1
Add inject_redir.py example
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Fri, 05 Aug 2011 14:39:32 +0800 |
parents | |
children | ff6f869273b7 |
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 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
11 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
|
12 from paraspace.injection import dexfile_redirect_types |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
13 import sys |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
14 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
15 if len(sys.argv) != 6: |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
16 print >> sys.stderr, \ |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
17 'usage: %s <src dex> <inject class> ' \ |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
18 '<dst dex> <redirect class> <output>' % \ |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
19 (sys.argv[0]) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
20 sys.exit(1) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
21 pass |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
22 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
23 src_dexname = sys.argv[1] |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
24 inj_classname = sys.argv[2] |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
25 dst_dexname = sys.argv[3] |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
26 redir_classname = sys.argv[4] |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
27 output_name = sys.argv[5] |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
28 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
29 decls = prepare_dep_decls() |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
30 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
31 src_dex = DEXFile.open(src_dexname) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
32 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
|
33 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
34 dst_dex = DEXFile.open(dst_dexname) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
35 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
|
36 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
37 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
|
38 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
|
39 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
40 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
|
41 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
|
42 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
|
43 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
|
44 typeidxs_redir = {redir_typeidx: inj_typeidx} |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
45 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
46 methodidxs_redir = \ |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
47 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
|
48 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
49 injected_typeidxs = [dst_linked.get_idx_classdef(classdef) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
50 for classdef in injected_classdefs] |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
51 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
|
52 excludes=injected_typeidxs) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
53 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
54 restore_dependencies(dst_linked, decls) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
55 dst_linked.make_checksum() |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
56 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
57 restore_raw = dst_linked.to_str() |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
58 |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
59 ofile = open(output_name, 'w') |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
60 ofile.write(restore_raw) |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
61 ofile.close() |