Mercurial > paraspace
diff paraspace/injection.py @ 131:044bfc415577
Fix issue of data map verification.
- Dalvik complain that data map generated by inject_redir.py is unexpected.
- Test case map_verify_error_test()
- Refactor inject_redir.py to paraspace.injection.inject_redir().
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Tue, 09 Aug 2011 11:47:43 +0800 |
parents | 4f508f84c8a1 |
children | 3dee4d929e1f |
line wrap: on
line diff
--- a/paraspace/injection.py Tue Aug 09 00:07:04 2011 +0800 +++ b/paraspace/injection.py Tue Aug 09 11:47:43 2011 +0800 @@ -645,3 +645,37 @@ dexfile_insert_classdefs_relative(dex_dst, dex_src, classdefs) redirect_injected_code(dex_dst, dex_src, classdefs) return injected_classdefs + + +## \brief Inject and redirect a _DEX_ClassDef from one linked to another. +# +# The _DEX_ClassDef given by inj_classname would be inserted to dst_linked, +# and redirect all invoking of type, given by redir_classname, to +# the injected one. +# +def inject_redir(src_linked, inj_classname, + dst_linked, redir_classname, decls): + from paraspace.dex_deptracker import dex_sort_sorted_arrays + from paraspace.dex_deptracker import restore_dependencies + + 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) + + dex_sort_sorted_arrays(dst_linked) + restore_dependencies(dst_linked, decls) + pass