1. 为什么需要插件化技术
插件化技术最初源于将app 中一些不常用的功能模块做成插件,主要有两个方面的好处:
但实际上现在插件化80% 的使用场景都是为了修复线上BUG 。当将一个项目的各个功能抽离为单独的可运行的模块的时候,也就是插件化的时候。如果项目的某个模块出现了问题,那么需要在短时间内修复这个问题,而重新打包发布Android 版到各大应用市场却已经来不及了。而插件化就可以做到只需要重新打包这个模块的代码,生成增量包,放到服务器上供用户下载即可更新。
当然,针对上述场景可选的技术方案不止插件化开发,Android 热修复技术也可以解决这个问题。但是插件化技术能做到的确不止是修复BUG 。比如吃鸡中的地图更新、皮肤更新等,这些都不需要重新打包一个新的发布版本。因为此时各个业务模块不再是事先分离的组件(即:aar )包,而是一个打包好的APK 文件,放在宿主APP 的assets 的目录下,用户只需要下载就可以实现更新操作,而这个方面的内容才是插件化技术的价值所在。
2. 插件化技术的历史
值得注意的是,插件化开发技术一直是我们中国的开发者在积极探索。这是因为在国外一般都使用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
|