Android插件化的历史及热门项目对比

简介

插件化技术一直是我们需要掌握的核心技能之一。随着移动互联网的快速发展,用户对应用的功能丰富度和更新频率提出了更高要求,传统的应用开发模式已经难以满足这些需求。插件化技术作为一种创新的解决方案,能够有效解决应用体积过大、功能模块耦合度高、更新发布周期长等问题。

本文旨在梳理Android插件化的历史发展脉络,对比分析各时期主流技术框架能解决的问题,并总结其优缺点。既是Android插件化的全面总结,又可以作为插件化入门的引导指南。

一、Android插件化技术概述

1.1 定义

Android插件化技术是一种允许应用程序在运行时动态加载和运行外部模块(插件)的技术方案。通过这种技术,我们可以将应用的部分功能模块从主工程中剥离出来,形成独立的插件APK,然后在主应用运行时动态加载这些插件,实现功能的动态扩展。

1.2 核心价值

  1. 减小主APK体积:将非核心功能模块剥离为主APK,显著减小主APK的大小,提升用户下载转化率
  2. 动态功能扩展:支持按需加载功能模块,用户可根据需要动态下载和启用特定功能
  3. 快速迭代更新:插件可以独立开发、测试和发布,无需整体应用重新上线,缩短更新周期
  4. 模块解耦:降低模块间的耦合度,提高代码可维护性和可扩展性
  5. 团队协作:不同团队可以并行开发不同的功能模块,提升开发效率

二、Android插件化发展历史

插件化技术的发展经历了多个阶段,从早期的简单动态加载方案到如今成熟的插件化框架,技术不断演进和完善。按照时间维度来看,主要发展历程如下:

2.1 早期探索阶段(2012-2013年)

AndroidDynamicLoader

AndroidDynamicLoader的作者是大众点评的屠毅敏,应该是最早的动态加载实现方案了。作者在介绍这个框架时形容宿主App就好像浏览器,但它加载的并不是网页,而是运行在Android系统上的插件。这个方案主要是在插件中使用Fragment,在宿主中使用Activity去动态加载插件中的Fragment。

  • 技术特点:使用Fragment作为插件载体,通过Activity动态加载
  • 局限性:功能较为简单,仅支持Fragment组件

23Code

23Code并不是一个开源的项目,它是一个完整的apk。在应用市场可以下载得到,它内部展示了一些有趣的动效,通过下载的方式,可以直接运行起来,这就是插件化的真实案例。

2.2 初期发展阶段(2014-2015年)

Altas/ACDD

Altas是阿里的伯奎分享出来的一个插件化的方案。分享视频中,伯奎讲到这个方案就是把宿主当做一个容器,动态加载对应的插件。要做到让插件无感知地运行在这个容器中,需要hook很多系统层面的东西,比如:ActivityThread,LoadedApk,ContextImpl,PackageParser,ActivityManagerNative等。

  • 技术特点:非代理Android动态热部署框架,Hook系统关键服务
  • 创新点:在当时是最为先进的插件化技术,为淘宝客户端提供了很多加载其他业务插件的能力

Dynamic-load-apk(DL)

Dynamic-Load-Apk简称DL,这个开源框架作者是任玉刚,他的实现方式是,在宿主中埋一个代理Activity,更改ClassLoader后找到加载插件中的Activity,使用宿主中的Activity作为代理,回调给插件中Activity所以对应的生命周期。

  • 技术特点:代理Activity模式,通过宿主Activity代理插件Activity生命周期
  • 优势:实现思路清晰,易于理解

2.3 成熟发展阶段(2016年至今)

DroidPlugin

DroidPlugin是张勇实现的一套插件化方案,它的原理也是Hook客户端一侧的系统Api,可能与Altas所Hook的点不同,细想应该是基本相同的。

  • 技术特点:完全插件化方案,插件APK可无需修改直接运行
  • 优势:零侵入性,功能完整性高

VirtualApp

VirtualApp作者是高中生罗迪,据说这个Android大牛初三的时候就开始研究双开、插件化的技术,相当了不起。项目的思路与DroidPlugin相似,不过他没有提供Service的代理,而是使用ContentProvider来代替Service在宿主中作为真正的运行体。

  • 技术特点:轻量级插件化框架,注重简洁性和易用性
  • 优势:框架轻量,易于集成,性能表现优秀

DynamicAPK

DynamicAPK是携程推出的动态加载方案,与ACDD一样修改了aapt,使得插件与宿主的资源不会出现相同id的问题。

三、主流插件化框架技术对比

3.1 技术实现原理对比

框架 核心原理 实现复杂度 兼容性风险
DroidPlugin Hook系统服务
VirtualAPK 代理模式+ClassLoader隔离
RePlugin 占坑技术+ClassLoader委托
Aura 代理模式+资源隔离

3.2 功能特性对比

框架 零侵入性 四大组件支持 性能表现 易用性
DroidPlugin 完整
VirtualAPK 完整
RePlugin 完整
Aura 完整

3.3 适用场景对比

框架 最佳适用场景 团队要求 维护成本
DroidPlugin 运行完整第三方APK 技术实力强
VirtualAPK 新项目快速集成 中等技术实力
RePlugin 商业项目稳定需求 中等技术实力
Aura 轻量级插件化需求 基础技术实力

四、热修复技术与插件化的关系

插件化技术的演进,带来了相关的热修复技术。有代表性的热修复技术有:

4.1 基于类加载机制的方案

QQ空间超级补丁技术 & 微信Tinker

这类方案的核心思想是在查找类之前,将插件的dex插入原有dex之前,使得能够加载的是最新插入进来的dex中的class。从而达到修复原有类的问题的目的。

  • 优势:修复范围广,可以修复任何类级别问题
  • 劣势:不能即时生效,patch如果修复的地方比较多,会影响启动时间

Nuwa系列

贾吉鑫根据QQ空间的思路做出了Nuwa开源到github上,之后又有很多类似的开源项目。

4.2 基于方法替换的方案

阿里AndFix

与类替换思路不同,它采用的是方法替换的思路,在native层,把这个方法实现体的指针替换为修复后的方法。

  • 优势:即时生效,修复速度快
  • 劣势:只支持方法层面的替换,不能使用未import过的类,不能替换整个类文件

4.3 基于插桩的方案

美团Robust

它的思想与InstantRun一样,在编译时动态地为每个类中的每个方法插桩,每个方法判断是否有插件被加载,有的话直接执行插件中的方法。

  • 优势:性能与修复场景兼顾,兼容性好
  • 劣势:实现复杂,包体积增加

五、技术选型建议

在选择插件化框架时,需要根据项目实际情况进行权衡:

5.1 项目规模考量

  • 小型项目:推荐使用轻量级框架如VirtualAPK或Aura
  • 大型项目:可考虑功能更完整的框架如DroidPlugin或RePlugin

5.2 团队技术实力

  • 技术实力强:可选择DroidPlugin等复杂但功能强大的框架
  • 技术实力中等:推荐VirtualAPK或RePlugin
  • 技术实力一般:建议使用Aura或其他轻量级框架

5.3 稳定性要求

  • 商业项目:优先考虑稳定性高的框架如RePlugin或Aura
  • 实验项目:可选择功能更激进的框架

5.4 维护成本评估

  • 人力充足:可选择维护成本较高的框架
  • 人力有限:推荐维护成本较低的框架

六、未来发展展望

随着Android系统的不断发展和技术生态的演进,插件化技术也在持续改进和完善。未来我们可以期待:

  1. 更标准化的解决方案:Android官方可能会推出更标准化的插件化支持
  2. 更好的性能优化:插件化框架在性能方面将持续优化
  3. 更强的安全性:随着安全要求的提高,插件化框架将加强安全机制
  4. 更简化的集成方式:未来的插件化框架将更加易于集成和使用

结语

Android插件化技术作为一项重要的架构设计手段,在解决应用体积、功能扩展、快速迭代等方面发挥着重要作用。通过对主流插件化框架的分析对比,我们可以看出每种方案都有其独特的优势和适用场景。

在实际项目中选择插件化框架时,我们需要综合考虑项目规模和复杂度、团队技术实力和维护能力、对稳定性和兼容性的要求以及插件化的目标和预期效果。

作为开发者,我们应该深入理解插件化技术的核心原理,根据项目实际情况选择合适的框架,并在实践中不断优化和完善,为用户提供更好的产品体验。同时,也要关注新技术的发展趋势,及时学习和掌握新的技术方案。


参考文献:
[1] 包建强. Android插件化:从入门到放弃
[2] T大. Android 插件化 动态升级
[3] 张涛. Android 插件化的 过去 现在 未来

参考文章:

https://www.jianshu.com/p/5771e8debe0e

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容