1. Android类的加载
-
BootClassLoader
系统启动时用于加载系统常用类,ClassLoader内部类
-
PathClassLoader
只能加载系统类和应用程序类,一般不建议开发者使用
-
DexClassLoader
加载dex文件以及包含dex文件的apk或者jar。也可以支持从SD卡进行加载,这也是意味着DexClassLoader可以在应用尚未安装的情况下加载dex相关文件。因此,它是热修复和插件化的基础。
经典案例:
File file = new File(Environment.getExternalStorageDirectory(),"plugin.dex"); File dir = this.getDir("cache_plugin",Context.MODE_PRIVATE); DexClassLoader dexClassLoader = new DexClassLoader(file.getAbsolutePath(),dir.getAbsolutePath(),null,getClassLoader()); Class<?> clazz = dexClassLoader.loadClass("com.dongnaoedu.plugin.MainActivity"); clazz.getMethod("doSomething").invoke(clazz.newInstance(),null);
1.1 双亲委派机制
遗留问题:String类能够通过动态加载的方式替换原生的String么? 不能,双亲委派机制的理解。
Android系统的双亲委派机制是:首先找DexClassLoader,其次就是去找PathClassLoader,最后查询BootClassLoader。
1.2 加载指定类的时序图
loadClass ->BaseDexClassLoader->DexPathList(findClass)
1.3 插件Dex的处理
1.4 Hook机制
-
Hook技巧
掌握反射和代理模式
尽量Hook静态变量或者单例对象
尽量hook public的对象和方法