之前的笔记搬运
DexClassLoader类
可以动态加载dex, 利用反射执行代码;
1 | DexClassLoader(String dexPath, |
dexpath表示所要加载DEX文件的路径
optimizedDirectory便是优化的DEX存放路径,
libraryPath表示DEX中如果调用自己的SO文件的路径
parent表示为自己的DexClassLoader指定父classloader
动态加载dex
加密dex -> 藏在资源或其他位置 -> 解密并写入Dex文件 -> 使用
DexClassLoader反射执行目标的Dex代码
Application类
Activtity是由Application类创建的, 所以有机会在Activtity之前执行代码;
1 | 1. 继承Application类写一个子类, 重写OnCreate函数或AttachBaseContext(这个比OnCreate执行时间更早); |
在AttachBaseContext调用java函数要注意context问题;
动态加载Activity
1 | 1. 加密目标程序dex, 藏在资源或其他位置 |
为什么要替换ActivityThread的classLoader
因为每个classloader只会在指定的文件了寻找和加载class,如果当前的classloader找不到目标Class时, 就会调用parent Classloader寻找与加载;
比如dexpath参数里指定了xxx.dex,那么这个dexclassloader只会在xxx.dex查找class, 所以要加载目标程序的Activity,必须把ActivityThread的classloader替换成我们创建的classloader才可以正在加载目标程序的Activity
核心代码
1 | //执行dex |