淘系技术部基于组件化实现业务运行期插拔能力
署名2021-02-25

淘系技术部基于组件化实现业务运行期插拔能力,在运行期,Atlas容器会加载所有的业务Bundle,以实现各个Bundle的运行隔离,这样做有如下2个好处。

dex得到控制

Bundle化的编译和架构设计,可以大幅减少主APK代码跟资源,从而大大节省用户的安装时间,这一特性在Android 4.x占主流的时期是极为重要的,因为控制dex数是当时行业APP面临的极大挑战。

异步按需加载

Lib的解压以及校验载入等过程。特别是Service等后台Component触发组件安装和前台Activity引发组件安装并行时对UI的渲染与操作流畅度很受影响。为了降低对UI渲染的影响,每个组件的安装都在一个统一的异步安装线程中进行。ActivityServiceReceiver等的发起都进行了异步处理。

整体容器设计的设计如图所示。

淘4.png

容器设计

最底层的tookit verifier全面枚举了上层需要反射使用的注入和代理的API,并在应用启动时首先进行全局性的校验,以避免在程序运行过程中遇到不兼容的情况。

上层的Bundle Framework负责组件的安装更新操作,以及管理所有组件的生命周期,其中组件的边界隔离遵循OSGIOpen Service Gateway Initiative,开放服务网关协议)规范,每个组件分配独立的类加载器(classloader),同时组件也有各自的资源,每个资源在构建期间由AAPTAndroid资产打包工具)分配独立的package ID

为了能够监控到android各个bundle中组件的启动运行情况,让淘系技术部在组件启动的合适的时机去做bundle的安装动作,淘系技术部引入了Runtime层。

1. Runtime层

Runtime层主要包括版本管理、清单管理以及系统代理三大块。

1)版本管理

每个组件在构建期间将由构建插件分配自己的版本号,同时在安装期间也会有各自的版本目录,每个Bundle的启动和加载都需要经过版本的校验,组件在发生更新的同时也将下发最新的版本信息。借助版本管理机制,组件的热更新能力水到渠成。

2)清单管理

OSGI(开放服务网关协议)规范中,每个组件通常会通过OSGI.MF来暴露自身的导出的接口,这一点与Atlas容器有所不同。在Android设备上,多文件的形式很容易受IO异常的影响,从而干扰Bundle的正常运行,所以淘系技术部采用了在构建期间集中生成清单的方式,清单中记录了Bundle所有的组件(Android四大组件)、依赖、包名等。

3)系统代理

各个系统关键点的注入使得Bundle可以做到按需加载,从而避免了像原生MultiDex方案由于首次启动时,多dex同步安装而造成UI卡顿的情况。代理层的核心DelegateClassLoader主要负责类的查找和路由,DelegateResource管理所有Bundle的资源,它们在容器启动时进行注入,并在运行过程中随着Bundle的不断载入而进行更新。

2. 接入层

简单即美,把复杂留给自己。

淘系技术部为了实现便捷的效果,Atlas容器由自身独立的应用启动入口,淘系技术部同时在构建期间会由插件替换应用原有的Application。运行期间,应用首先由AtlasBridgeApplication负责启动,并在容器启动完毕后将真正的Application全权代理给应用;淘系技术部同时对于需要自定义和由外部决策的功能,容器将开放接口由接入方进行简单设置。

淘系技术部基于OSGI的设计思想,每个业务Bundle在运行时都有自己独立的生命周期,如0

淘5.png

Bundle生命周期

如图所示,淘系技术部的整个研发效率得到了大幅度的提高。

移动平台400多名工程师可以进行高效的协同开发。

部门外20多个BU(业务单元)参与贡献代码。

平均每两周发布1个版本。

业务有问题可以做到随时发布。

淘6.png

取得的效果