插件化实现之一类的加载

94 阅读1分钟

1. Android类的加载

image.png

  • 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 双亲委派机制

image.png

遗留问题:String类能够通过动态加载的方式替换原生的String么? 不能,双亲委派机制的理解。

Android系统的双亲委派机制是:首先找DexClassLoader,其次就是去找PathClassLoader,最后查询BootClassLoader。

1.2 加载指定类的时序图

image.png

loadClass ->BaseDexClassLoader->DexPathList(findClass)

1.3 插件Dex的处理

image.png

1.4 Hook机制

image.png

  • Hook技巧

    掌握反射和代理模式

    尽量Hook静态变量或者单例对象

    尽量hook public的对象和方法