说明
最近项目想要做模块动态升级,所以了解了最近还在维护的插件化框架Shadow.
shadow框架的官网的顶置issue,里面有非常多的关于框架的解析的文章,文字。想要了解此框架,这个必看。
这里还是截取一张项目代码图。
项目解读
shadow框架为了实现复杂的插件化框架本身也动态升级,做了很多复杂操作:
宿主本身只跟plugin-manager插件交互
来说一下plugin-manager插件,依赖core-manager,dynamic-manager。
core-manager:
1、插件信息的存储
2、插件信息的管理
3、 so、dex管理
4、插件包zip释放
dynamic-manager:
1、只提供最基础的 dex、 res、so 的释放的基础API,这些 API 的组合调用需要自己实现
2、只负责加载 业务插件运行需要的 loader 和runtime 插件,业务插件的加载由 loader 插件实
现
宿主和manager插件交互,是直接通过构造ApkClassLoader
,加载manager插件,构造插件里面的PluginManagerImpl
对象。具体可以看ManagerImplLoader
类。
在构造PluginManagerImpl
对象的时候,是通过调用manager插件固定类里面的固定方法com.tencent.shadow.dynamic.impl.ManagerFactoryImpl#buildManager
,然后这个PluginManagerImpl
最终也是我们自己实现的。
我们需要实现PluginManagerImpl
,然后根据不同的意图,比如打开activity,启动service,来调用不同的core-manager
,或者dynamic-manager
的方法,比如安装插件、打开插件activity之类的。
总体而言,自由度比较大,但是弊端也很明显,我们自己也要做很多的工作。