[Android]用架构师角度看插件化(1)-Replugin入门剖析

多谢一直以来的支持,组件化的内容,应该会有一段时间不再更新,一些非常关键的技术将会在我将要出版的组件化书籍中提及。

组件化模块化的开发适合于中小型企业的业务叠加,和代码重用。而插件化的开发将组件化和模块的功能完全解耦出来。

在国内的开发环境,插件化是用户体验和开发周期的产物,我们要做的是顺应潮流,正如我组件化&模块化&插件化演进中分析一样。

Replugin,滴滴出品的VirtualApk,还有阿里出版了一本热修复框架的书籍,这些估计都足够很多人学习很久了。

这里我将挑选了一下Replugin的技术作为接下来方向的研究,将会给大家剖析他的运行过程,希望大家不腻赐教。

将会有多个章节介绍,希望大家一起进步吧。


一.Github介绍

Replugin地址(https://github.com/Qihoo360/RePlugin)


强大的介绍,希望大家都去看看起介绍,有个基础的了解吧。

其一些配置原理再这里(详细介绍


这里是当然看完了应该就对他有一个基本的了解了。

只有真正深切去了解过插件化,才明白它做到的飞跃性。


二.工程布局

下载一下源码,我们可以看到,其里面包含了五个文档。


replugin-host-gradle 是宿主gradle脚本

replugin-host-library 是宿主library源代码,我们依赖的源代码就是这个了

replugin-plugin-gradle 插件的Gradle脚本

replugin-plugin-library 插件的源代码,插件都需要依赖这个

replugin-sample 当然就是例子啦

我们看一下replugin-sample,里面包含了host宿主,还有两个plugin的的demo,这章就先研究这个例子,然后下节将会开始深入的源码介绍。



三.host宿主

首先是在build.gradle的classpath引用 gradle


然后源码中引用


然后我们需要在Application中配置

这里是动态配置Application


然后当然就是一般关心的跳转问题

这里demo1是包名,然后之后的是跳转Activity的地址


Replugin.startActivity是使用坑位跳转的,坑位在哪里声明,下一章节会介绍。

然后官网有介绍一些跳转方法,最重要是用到隐式跳转,通过包名和类跳转。


然后还有跳转Fragment的示例

这里面想要加载插件的Fragment,需要先注册Fragment整个的包名+地址名称。

然后还需要Replugin中的ClassLoader机制,而这里每个dex貌似都会有一个classloader,这个之后会介绍。

这里面loadCalss是先获取到Fragment为Class对象,然后通过asSubClass改为Fragment.clas类型,当然newInstance就是真正的创建对象了。


然后我们看一下app中,安装前需要内置插件,将插件(XXX.jar)放到assets里面,将会和app一起跟随安装,这是作为连同宿主初始时加载某些必要插件的内置安装。


我们看一下引用了replugin的gradle命令会有什么额外的编译


rpGenerateDebugBuiltinJson编译出插件的json目录


rpGenerateDebugHostConfig会显示出整个Replugin的配置


rpShowPluginsDebug命令是打印出插件版本信息。



rpGenerateReleaseBuitInJson、rpGenerateReleaseHostConfig、rpShowPluginsRelease编译出Release版本的文件


四.lib插件

我们插件还是一样需要Gradle配置



之前提及到startActivity的方式,Replugin中在插件内因为有ClassLoader是独立,使用平常的startActivity的跳转方式。而插件间使用startActivity跳转,需要使用Replugin.startActivity或者隐式跳转来完成。


而插件间的通信,Replugin是使用了aidl的方式来完成


这里需要使用远程通信来完成。Android一开始设计IBinder就是设计为跨进程间的通信的,而这里面就算插件运行为独立进程也是没问题的。


我们再看一下AndroidManifest,声明方式和平常的Android工程并无不同

值得注意的是,AndroidManifest通过meta-data来声明的。


然后看一下Lib中加载的额外的Gradle命令



运行reInstallPluginDebug来运行安装,我们看到是将其放到sdk,然后再安装

然后使用reRunPluginDebug应该是运行命令,无奈提示失败


以后修复后再给大家介绍。

如何生成内置的插件的jar文件,直接插件生成apk后缀改为apk,然后放到assets里面,宿主的gradle编译时才能识别。




总结

我们入门剖析Replugin。

(1)配置接入-接入成本最低,并不需要编写一般的占坑规则

(2)跳转效率-插件内原生跳转,插件外隐式跳转或占坑跳转

(3)插件通信-插件间通信使用aidl,这样就算插件独立进程依然通信正常。

(4)维护成本-hook点只有一个,减少最少意味着维护成本也降低

(5)加载方式-宿主内置jar和外置加载apk加载的方式

这些就是接入插件化需要估量的方面,然后深化研究代价利弊才能更加深入一步步评估出适合你们项目的插件化。

希望以后大家多多关注!下期将不会再在简书首发哦。

作者:Cang_Wang 链接:https://juejin.im/post/5962e2da6fb9a06bc903b594 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。