前言
从去年开始,插件化和热修复技术就一直很火,本人对这些技术也很关注。虽然说这些技术可能在今年就会退热。但是其中的技术点,我们还是需要get到的。今天就来学习下,掌阅的ZeusPlugin
ZeusPlugin中包含插件化和热修两部分,其中热修涉及到的原理以及gradle插件部分,这里就不说了,热修还是QQ空间的超级补丁方案。
现在,开始单独说下插件部分的原理。
插件的安装
插件的安装过程分为三个步骤:
- 将插件复制到指定文件夹中
- 进行dex优化
- 将dex文件添加到classloader中
- 将资源添加到AssetManager中
将插件复制到指定文件夹的过程有ZeusPlugin来完成。具体代码,这里不说了。
dex优化过程,生成DexClassLoader即可。
重点看下下面两步。其中添加dex文件的过程由PluginManager#loadPlugin方法来完成,代码如下:
|
|
代码虽然长,但是逻辑却很简单,调用ZeusClassLoader#addApkPath的方法,加入。这里的具体代码也不分析了,关于双亲委托机制,就不说了。
这些做完之后,会调用reloadInstalledPluginResources,加载资源并清除掉之前的缓存。
|
|
同样是通过一系列反射调用。略。
组件启动
和其他一样,这里也是需要进行占桩,不过这里比DroidPlugin的处理要简单点,但是我们需要预先确定。这一点比较麻烦。关于如何占桩,这里不说了,感兴趣的看下weishu的文章。还有一点区别就是,我们这里调用通过Classloader根据类名去获取class信息的。所以我们不需要对Instrumentation进行特别大的修改。详情,看源码吧。
资源冲突
这里是通过修改aapt,通过固定资源id前几位的方式做的。关于aapt修改,github上有不少代码,感兴趣的可以看下,这里占个坑。我也没看~~~
总结
ZeusPlugin很轻量,但是能满足我们的需求,个人感觉是一个不错的选择。