Mercurial > paraspace
view examples/inject_redir.py @ 123:78357afb4a9d
Test case for restore_dependencies()
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Sat, 06 Aug 2011 19:09:15 +0800 |
parents | 4f508f84c8a1 |
children | ff6f869273b7 |
line wrap: on
line source
## \file # # This is an example of inject a class from source to destinate DEX, and # rewrite all references of a specified class with the injected one and its # methods. All calls of specified class will be redirected to the # injected class. # from paraspace.dexfile import DEXFile, DEXFile_linked from paraspace.dex_deptracker import prepare_dep_decls from paraspace.dex_deptracker import restore_dependencies from paraspace.injection import inject_classdefs, make_methodidxs_redir_map from paraspace.injection import dexfile_redirect_types import sys if len(sys.argv) != 6: print >> sys.stderr, \ 'usage: %s <src dex> <inject class> ' \ '<dst dex> <redirect class> <output>' % \ (sys.argv[0]) sys.exit(1) pass src_dexname = sys.argv[1] inj_classname = sys.argv[2] dst_dexname = sys.argv[3] redir_classname = sys.argv[4] output_name = sys.argv[5] decls = prepare_dep_decls() src_dex = DEXFile.open(src_dexname) src_linked = DEXFile_linked.build_dependencies(src_dex, decls) dst_dex = DEXFile.open(dst_dexname) dst_linked = DEXFile_linked.build_dependencies(dst_dex, decls) inj_classdef = src_linked.find_class_name(inj_classname) injected_classdefs = inject_classdefs(dst_linked, src_linked, [inj_classdef]) redir_typeid = dst_linked.find_typeid_name(redir_classname) redir_typeidx = dst_linked.get_idx_typeid(redir_typeid) inj_typeid = dst_linked.find_typeid_name(inj_classname) inj_typeidx = dst_linked.get_idx_typeid(inj_typeid) typeidxs_redir = {redir_typeidx: inj_typeidx} methodidxs_redir = \ make_methodidxs_redir_map(dst_linked, dst_linked, typeidxs_redir) injected_typeidxs = [dst_linked.get_idx_classdef(classdef) for classdef in injected_classdefs] dexfile_redirect_types(dst_linked, typeidxs_redir, methodidxs_redir, excludes=injected_typeidxs) restore_dependencies(dst_linked, decls) dst_linked.make_checksum() restore_raw = dst_linked.to_str() ofile = open(output_name, 'w') ofile.write(restore_raw) ofile.close()