动态加载dex的两种方式

DexClassLoader 加载的类是没有组件生命周期的,也就是说即使DexClassLoader通过对dex的动态加载完成了对组件的加载,当系统启动该组件时,还会出现加载类失败的异常。
有两种方式可以解决上面出现的问题:

方法一:http://blog.csdn.net/androidsecurity/article/details/8809542,更改系统的classloader使其为自定义的加载器。

特点:两个dex具有明显的分割线,第一个dex只起启动作用,后面不会出现第一个dex的类加载信息,也就是所谓的“加壳程序”。

主要点:

1.替换classloader:RefInvoke.setFieldOjbect("android.app.LoadedApk", "mClassLoader",wr.get(), dLoader);

2.替换application:RefInvoke.setFieldOjbect("android.app.ActivityThread","mInitialApplication", currentActivityThread, app);

3.替换contentprovider RefInvoke.setFieldOjbect("android.content.ContentProvider","mContext", localProvider, app);

 

方法二:http://www.cnblogs.com/twlqx/p/4716026.html,利用分包处理的方法,将第二个dex的类信息加入到第一个dex的pathclassloader的element中。

特点:两个dex的类可以互相调用,一般而言,外部dex包含关键的隐藏的类信息。

主要点:

1.加载外部dex:

DexClassLoader dexClassLoader = new DexClassLoader(libPath, sApplication.getDir("dex", 0).getAbsolutePath(), libPath, sApplication.getClassLoader());

2.合并pathclassloader和dexclassloader的element属性,并赋值给pathclassloader的element

 Object dexElements = combineArray(getDexElements(getPathList(pathClassLoader)), getDexElements(getPathList(dexClassLoader)));

 Object pathList = getPathList(pathClassLoader);  

 setField(pathList, pathList.getClass(), "dexElements", dexElements);  

 

转载于:https://www.cnblogs.com/twlqx/p/4717035.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值