最近一直在做插件化相关的工作。现在最常见的方案就是来自阿里的 Atlas 和 360 的 DroidPlugin 了。按照我的理解,对于当前的大多数应用来讲,可能 Atlas 会更适合一些,因为它允许插件与宿主之间,甚至是插件之间可以有互动;而 DroidPlugin 的思想会更先进,可想象空间更大一些,理论上它可以启动任何一个第三方应用,比如虚拟化,可参照物就是 LBE 的平行空间。Atlas 并没有开源,DroidPlugin 已开源,我们现在采用的方案是基于 Atlas 的,有兴趣的可以看看 ACDD ,核心思想都是一样。
不管是插件化,还是热补丁,现在的方案都比较多,相应方案在 GitHub 上也都能找得到 demo ,Google 一下,也有不少文章,然而停留在 demo 和文章介绍阶段,始终与实际的生产开发有较大的距离,尤其是大部分文章还只是纸上谈兵,写文章的十之七八恐怕都没有真正的在自己的应用里实践过,而插件化最困难的部分就是实践过程中遇到各种细节和适配问题,还有对当前开发模式的影响也是怎么都绕不过去的问题。下面我大致列一下我们在实践过程中遇到的一些问题。
插件怎么去引用宿主里的类?
插件怎么去引用宿主的资源?
插件化要给每个插件进行资源分段,该如何进行资源分段?
为了让业务的同学更容易接受,怎么处理宿主的类和资源?
在引用宿主的资源的时候,默认可用的 context 在插件化里是否依然可用?
不同的资源类型,引用和处理方式是否相同?
插件之间共用的一些类,是放在宿主里,还是在插件里开放出接口,该怎么样去考量?
插件如何去开放接口,让其他插件引用?
插件开放出了接口,其他插件又该怎样去引用?
不同的插件都要引用同一个类和同一个资源,类和资源重复了该怎么办?
加载各个插件时,怎么样知道各个插件的信息?
插件版本该如何去管理?
怎样实现 debug 和 release 开发的宿主和插件打包?
应用启动时要加载那么多插件,怎么加速第一次启动?
插件引用的宿主的类和资源发生改变,难道每次都要去每个插件里手动修改吗?
四大组件的免注册是怎么回事?
四大组件免注册了,是否还需要合并每个插件的 AndroidManifest ?
在不允许手动拷贝的情况下,如何合并各个插件的 AndroidManifest ?
宿主的方法数超过 65535 了,该怎么办?
混淆问题怎么去处理?
适配,还是适配。
实际操作中,因为对开发的影响是不可避免的,多亏了有 gradle ,通过定制 gradle 脚本,插件,甚至是 SDK 组件,很多事情我们可以做到自动化,当然,凡事有利就有弊,在这个过程中,会发现相当多的正常开发遇不到的 gradle 的『bug』,因此,假如 gradle 玩不转,会有很多麻烦。目前大致能想到的就这么多,以后有想到了再补充吧。