文章目录
1. 为什么需要插件化技术
插件化技术最初源于将app
中一些不常用的功能模块做成插件,主要有两个方面的好处:
- 减小了安装包的大小;
- 实现
app
功能的动态扩展;
但实际上现在插件化80%
的使用场景都是为了修复线上BUG
。当将一个项目的各个功能抽离为单独的可运行的模块的时候,也就是插件化的时候。如果项目的某个模块出现了问题,那么需要在短时间内修复这个问题,而重新打包发布Android
版到各大应用市场却已经来不及了。而插件化就可以做到只需要重新打包这个模块的代码,生成增量包,放到服务器上供用户下载即可更新。
当然,针对上述场景可选的技术方案不止插件化开发,Android
热修复技术也可以解决这个问题。但是插件化技术能做到的确不止是修复BUG
。比如吃鸡中的地图更新、皮肤更新等,这些都不需要重新打包一个新的发布版本。因为此时各个业务模块不再是事先分离的组件(即:aar
)包,而是一个打包好的APK
文件,放在宿主APP
的assets
的目录下,用户只需要下载就可以实现更新操作,而这个方面的内容才是插件化技术的价值所在。
2. 插件化技术的历史
插件化框架名称 | 作者 | Github地址 | 支持类别 | 需要在清单文件注册 |
---|---|---|---|---|
AndroidDynamicLoader | 2012年大众点评的屠毅敏(最早的动态加载实现方案)【代理Fragment 】 | https://github.com/mmin18/AndroidDynamicLoader | 只支持Activity | 否 |
Altas | 2013年淘宝的伯奎 【hook 底层】 | https://alibaba.github.io/atlas/ | 支持四大组件 | 否 |
dynamic-load-apk | 2014年百度的任玉刚 【代理Activity 】 | https://github.com/singwhatiwanna/dynamic-load-apk | 只支持Activity | 否 |
DroidPlugin | 2015年奇虎360的张勇【hook 】 | https://github.com/Qihoo360/DroidPlugin | 支持四大组件 | 否 |
DynamicAPK | 2015年携程【基于OpenAltas 】 | https://github.com/CtripMobile/DynamicAPK | 只支持Activity | 否 |
Small | 2015年二手车交易平台林光亮【hook 】 | https://github.com/wequick/Small | 支持四大组件 | 是 |
RePlugin | 2017年奇虎360手机卫士【hook 】 | https://github.com/Qihoo360/RePlugin | 支持四大组件 | 否 |
VisualApk | 2017年滴滴 | https://github.com/didi/VirtualAPK | 支持四大组件 | 否 |
值得注意的是,插件化开发技术一直是我们中国的开发者在积极探索。这是因为在国外一般都使用Google Play
,在这个官方市场不允许插件化APP
的存在。且因为国内的场景不同,在国内任何数据的显示错误或者奔溃都直接导致更过利润的丢失,所以在国内这个相对宽松的环境下,插件化技术运营而生。
3. 插件化实现思路
利用hook
技术实现欺上瞒下。Android
系统是多进程的,所以系统服务实际上不知道App
进程中具体运行的代码,所以使得欺上瞒下成为了可能。欺上是指让系统不知道我们的插件在宿主App
中运行;瞒下是指让插件以为自己已经被安装。当然也有使用Java
动态代理来实现的欺上瞒下,比如DroidPlugin
。
无意间看到《Android
插件化开发指南》这本书作者包老师的专访记录:专访包建强:为什么我说 Android 插件化从入门到放弃?。这里简单做一个摘要:
3.1 InfoQ:您在 GMTC 中的议题叫做《Android 插件化:从入门到放弃》,请问这个标题代表什么意思?
包建强:哈哈哈。我是觉得,如果这个演讲主题是《
Android
插件化:从入门到精通》的话,就体现不出真是想明白了这个领域。所以最近冒出来各种从入门到放弃、改行、住院、出家的技术书籍,我觉得那反而是说明作者是真的大彻大悟了,武侠小说里面有写,虽“飞花摘叶皆可伤人,草木竹石均可为剑”,就是这种境界。
不过要声明的是,我对Android
插件化的认识,远不如冯森林、张勇、罗迪这些人。
我有一个Android
插件化研究的群,三十多人,都是国内各个插件化开源项目的作者、公司插件化的实施者,以及传经授道的博客作者。我们都感受到 Android 插件化技术基本已经成型了,随着 React Native 的横空出世,Android 插件化会慢慢退出历史舞台,也就是这一两年的事情吧,所以要给后人留下点什么,于是便有了这次技术分享
。
我的分享讲包括插件化技术的历史和各种八卦,各个技术流派,一些小例子,各个开源项目的思想,插件化实施过程中遇到的问题,以及未来的发展方向。45 分钟,我尽量讲的生动有趣一些。
3.2 InfoQ:请问您是如何学习的?对于初学者有什么建议?
- 首先就是去写代码。有一个做
Android
的哥们升级为架构师,需要了解iOS
这门技术,来问我怎么能迅速精通iOS
,我就告诉他,别玩虚的,脚踏实地跟着iOS
开发团队做几个需求,半年之后再来谈这个话题。Android
和iOS
的很多现金思想可以相互借鉴,我建议做一门技术的同学,也适当学习另一门技术。 - 咬着牙看开源项目。比如说
JSPatch
,怎么看?我有个建议,你看JSPatch
的版本提交历史,从第一次提交看起,这时候的功能应该是最简单的,也是最容易看懂的,然后看历史每次提交都修改了哪些东西,你能搞清楚作者的思路是什么。 Android
插件化虽然有被React Native
取代的势头,但还是要搞清楚插件化所涉及的各种思想和技术。我这一年来的心得是,这是提高自身内功的极好办法。尤其是涉及到Android
系统底层的各种Hook
。- 写技术博客吧。每天看文章只能是看过,一个月后能沉淀下来的没有多少,好记性不如烂笔头。一开始你可以转载或罗列精品文章的链接,慢慢的开始分享自己的心得,翻译些技术文章,技术水平提高是一个循序渐进的过程。
4. 其他
除了插件化和热修复可以用来修复bug
以外,React Native
也可以用来修复bug
和动态发布新功能,和Android
插件化开发有异曲同工之妙。值得注意的是React Native
虽然是H5
编写,但是和Hybrid
技术不同。由于H5
很慢所以React Native
将HTML5
翻译为了原生代码。
既然React Native
也可以达到效果,且效率上可以得到满足。那么未来React Native
会成为App
开发的主流?
References