Mercurial > paraspace
comparison 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 |
comparison
equal
deleted
inserted
replaced
130:117047deda64 | 131:044bfc415577 |
---|---|
643 | 643 |
644 injected_classdefs, injected_typeids = \ | 644 injected_classdefs, injected_typeids = \ |
645 dexfile_insert_classdefs_relative(dex_dst, dex_src, classdefs) | 645 dexfile_insert_classdefs_relative(dex_dst, dex_src, classdefs) |
646 redirect_injected_code(dex_dst, dex_src, classdefs) | 646 redirect_injected_code(dex_dst, dex_src, classdefs) |
647 return injected_classdefs | 647 return injected_classdefs |
648 | |
649 | |
650 ## \brief Inject and redirect a _DEX_ClassDef from one linked to another. | |
651 # | |
652 # The _DEX_ClassDef given by inj_classname would be inserted to dst_linked, | |
653 # and redirect all invoking of type, given by redir_classname, to | |
654 # the injected one. | |
655 # | |
656 def inject_redir(src_linked, inj_classname, | |
657 dst_linked, redir_classname, decls): | |
658 from paraspace.dex_deptracker import dex_sort_sorted_arrays | |
659 from paraspace.dex_deptracker import restore_dependencies | |
660 | |
661 inj_classdef = src_linked.find_class_name(inj_classname) | |
662 injected_classdefs = inject_classdefs(dst_linked, src_linked, | |
663 [inj_classdef]) | |
664 | |
665 redir_typeid = dst_linked.find_typeid_name(redir_classname) | |
666 redir_typeidx = dst_linked.get_idx_typeid(redir_typeid) | |
667 inj_typeid = dst_linked.find_typeid_name(inj_classname) | |
668 inj_typeidx = dst_linked.get_idx_typeid(inj_typeid) | |
669 typeidxs_redir = {redir_typeidx: inj_typeidx} | |
670 | |
671 methodidxs_redir = \ | |
672 make_methodidxs_redir_map(dst_linked, dst_linked, typeidxs_redir) | |
673 | |
674 injected_typeidxs = [dst_linked.get_idx_classdef(classdef) | |
675 for classdef in injected_classdefs] | |
676 dexfile_redirect_types(dst_linked, typeidxs_redir, methodidxs_redir, | |
677 excludes=injected_typeidxs) | |
678 | |
679 dex_sort_sorted_arrays(dst_linked) | |
680 restore_dependencies(dst_linked, decls) | |
681 pass |