Android插件化之从入门到放弃

Android插件化框架一直以来就是安卓平台上的一个重要技术方向,从携程的DynamicAPK到360RePlugin再到阿里巴巴的Atlas,甚至美团和滴滴的安卓团队都有自己的一套安卓插件化解决方案。面对业界如此热门的技术方向,在对比业界开源的插件化方案后,团队内部于去年10月份开始(2017.10)在项目中选择开源的Small插件化框架进行了尝试。鞋是否合适需要穿上脚才能知道。这篇文章总结了我在使用Small插件化框架后,自己对插件化的理解和思考。

关于Small插件化的其他文档

《Android插件化之Small框架实践总结》
《Android插件化之Small框架原理》
《Android插件化之资源加载机制》

0x02 重新审视插件化框架的利弊

2.1 插件化方案想要解决的核心问题

安卓的动态化发布

动态化就像是天赋,有些人天生就有的能力却是需要你花非常大精力也未必能获取到的。前端的开发应该从来不需要动态化的方案吧!插件化方案的一个最大作用应该就是绕开应用市场的审核周期,尽可能的像后端Java或者前端JS一样,随时发布随时生效。

真正意义上的模块解耦

插件化的方式让模块与模块之间在开发方式上真正的隔离,达到了解耦的目标。而这在之前android原生的开发方式上是很难达到的。

dex 65535问题

插件化的方案也可以看做一个dex分包和资源分包的方案。

2.2 Small插件化方案带来的新问题

《Android插件化之Small框架实践总结》 中对比了Small插件化框架的优缺点,选择Small最重要的原因还是轻量化,当然很多问题也是轻量化带来的。

兼容性问题

兼容性问题大致分布在以下几个方面:

  1. 与google最新系统和编译工具的兼容。18年第三季度最新版本Android P系统的新手机会陆续上市,插件化架构对新系统的兼容性问题会变的急切。并且插件化框架针对安卓系统的黑科技也越来越不被新版本系统接受。Android Studio 3.1最新新编译工具的兼容问题。
  2. 业界移动安全方案的兼容。常见的三方dex加壳方案无法在插件化框架上顺利运用。
  3. 第三方框架的兼容,常见涉及AOP的第三方框架,如AAC和Small框架不兼容。甚至React Native方案都需要花很多时间和精力去适配。

插件化框架带来的稳定性问题

  1. 资源查找失败的bug,虽然已经接近了在个别国产手机上的资源查找失败问题,详情见《Android插件化之资源加载》。但是在Android 7.1以上的系统上依然出现偶现的资源查找失败问题。并且崩溃率(错误数/启动次数)在0.3%左右。这个比例其实不算低了。这个bug暂时只能通过将插件资源转移到宿主分身中绕过。但是如果把所有插件资源都放到宿主中以规避这个问题,那插件化就没有任何意义了。

2.3 重新思考插件化框架给安卓app的收益

在团队技术选型上优先考虑的应该是和现有业务适配吧。如果你所面对的业务不存在快速迭代频繁发布的需求,插件化框架的威力可能就要减小一半了。同时在选择个人开发者维护的开源项目时,依然是要考虑到其架构的稳定性和bug的修复时效。因为一旦在一个商业化的项目中使用开源框架,稳定性和兼容性一定会放在首要位置的。在这一点上,可能从大公司孵化出的开源项目会更有优势。

在回看插件化框架对android应用中模块解耦的贡献,对比android应用的原生的开发方式。能够从插件化框架吸收的模块解耦方法上可以看到大致这几个方面。

模块间的解耦要依赖工具而不是约定开发规范

以2个业务app模块为例,应该有一个工具存在避免这两个模块产生耦合关系,如果一旦存在耦合关系就可能编译报错。而不是靠开发者约定的开发规范。因为规范是可以不遵守的。这是同层级间的耦合管理。

避免依赖传递

这是不同层级的模块间耦合问题。implementation关键词就可以解决这个问题。

路由

相比较插件化框架你可能更需要一个页面路由工具,业界有很多业界路由框架,比如阿里的ARouter,路由用来解决模块解耦带来的页面跳转问题,所以自己动手实现一个简单的路由工具也不是很难。

2.3 implementation、api和compile的差异

可以查看google文档上对Android Studio 3.0后新引入的依赖配置的差异说明。
https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration

简单来说google将compile配置拆成了两个关键词,分别是api和implementation。api和implementation的差异不单单是编译效率的差异,我觉得更重要的是,implementation避免了依赖的传递。以下图对比api和implementation的差异可以发现,当使用implementation配置依赖时,app模块将不会直接依赖D模块。在使用老的依赖配置compile时,实际上并没有做到模块的分层,最底下的模块依然可以被最上层的模块依赖,实际的依赖规则在开发者的规范里,而不存在项目模块的管理中。

0x04 总结

以上就是我对插件化框架的看法,如果你的业务存在开始迭代频繁发布的情况存在,那么你可能就很需要一个插件化框架来带来开发方式上的改变,核心在于提高了研发效率。但是在使用插件化项目之前你需要对插件化框架的边界和扩展边界的成本有一个清晰的认识。实际上上面所说的所有插件化框架带来的问题都是可以解决的。问题的关键在于在你的团队这样的付出和产出是否值得呢?相信每个人都可能会有不同的看法。

当然开源的插件化框架依然是重点学习的方向,理解不同插件化方案的实现原理是深入理解安卓系统很好的切入点。接下来我还会花更多的时间深入的学习360和阿里巴巴的插件化方案。

最近在读《邓小平改变中国》这本书,让我对从文革结束到改革开放前那段对大多数中国人讳莫如深的历史有了大致的了解。“实践是检验真理的唯一标准”,这句很多80后90后耳熟能详的口号背后,原来发生了这么多的波折,冲破了如此多的障碍。理论与实践的统一是马克思主义的一个最基本的原则实事求是是毛泽东思想的精髓。听起来虚头巴脑,但确实应该是解决问题和对待未知事物的核心方法论。对!这是一篇技术总结。

0x05 转载请标明出处病已blog https://ivonhoe.github.io/