插件化开发和热修复
共同原理:
都使用ClassLoader来实现的加载的新的功能类,都可以使用PathClassLoader与DexClassLoader
不同的是:
热修复因为是为了修复Bug的,所以要将新的同名类替代同名的Bug类,要抢先加载新的类而不是Bug类,所以多做两件事:在原先的app打包的时候,阻止相关类去打上CLASS_ISPREVERIFIED标志,还有在热修复时动态改变BaseDexClassLoader对象间接引用的dexElements,这样才能抢先代替Bug类,完成系统不加载旧的Bug类
而插件化只是增肌新的功能类或者是资源文件,所以不涉及抢先加载旧的类这样的使命,就避过了阻止相关类去打上CLASS_ISPREVERIFIED标志和还有在热修复时动态改变BaseDexClassLoader对象间接引用的dexElements
所以插件化比热修复简单,热修复是在插件化的基础上在进行替旧的Bug类
插件化是在[运行时],而组件化是在[编译时]。换句话说,插件化是基于多 APK 的,而组件化本质上还是只有一个 APK。
设置 apply plugin: 'com.android.application' 是主模块
apply plugin: 'com.android.library' 是library
组件式开发
http://www.open-open.com/lib/view/open1481772233714.html
http://www.jianshu.com/p/bb30c31de505
插件式开发 DexClassLoader 加 Activity 代理
DroidPlugin
https://github.com/Qihoo360/DroidPlugin
Small
https://github.com/wequick/Small
VirtualAPK
https://github.com/didi/VirtualAPK
RePlugin
https://github.com/Qihoo360/RePlugin
总结
从个人感觉来说,如果工程量不大,又对多进程没有太多的想法的工程完全可以优先使用Small。而如果整个工程量大,以后又可能使用多进程,追求稳定的大型项目还是推荐RePlugin。
这里如果好奇AppCompat应该如何兼容的读者可以看看:
红橙Darren:https://www.jianshu.com/p/e359fafe5c29
还有对我的插件化基础模型感兴趣的可以去我的github上:
https://github.com/yjy239/HostApplication
热修复
阿里开源的热修复框架AndFix热修复框架地址
在Android
中有两个类加载器,分别为PathClassLoader
和DexClassLoader
。其中我们正常开发的APP使用的类加载器就是PathClassLoader
。系统类和应用类的加载器
DexClassLoader:能够加载未安装的jar/apk/dex
PathClassLoader:只能加载系统中已经安装过的apk multidex-谷歌官方推荐的一个分包方式
原理 | 方案 |
---|---|
Native hook方案,方法替换Instant Run的热插拔原理,native层造成的问题就是兼容性问题 | AndFix |
QQ空间提出的Classloader替换类的方案 | Nuwa, HotFix, RocooFix |
Instant Run的冷插拔原理的Dex替换,DexClassLoader,吧旧的dex和补丁dex融合形成新的dex,确定需要重启 | Tinker |
multidex分包原理