总结
- 基本都是使用DexClassLoader进行加载,构造函数的参数分别是:apk/dex/jar路径、缓存oat的路径(已无效)、lib路径、父类加载器。只是加载dex和lib,其它资源不会加载。dex中全部java类载入。
- 加载时注意权限,api23以后权限写在清单里是没有效果的(如sd卡读写权,只是能开启但不会自动开启),开启需要写代码询问或者手动去设置中开启清单申请的。没有权限会直接抛出一般错误
- 查看错误原因时要逐层向父类找,比如找不到加载类错误的父类可能抛出的是未加载dex
壳加载方案:
因为需要原apk的各种manifest声明、资源、lib、以及权限问题,所以一般在原apk中进行修改,在manifest中加入最早运行的类application的自定义声明,并将原application名保存,将原apk的资源、dex加密。放入自己的dex(一般包含原dex)、so到apk中。在自己的dex-application中加载so。so内解密资源、解密dex、加载dex。之后替换运行原本application即可。