近日,手机淘宝安卓客户端容器化框架Atlas正式宣布开源。Atlas由阿里巴巴移动团队自研,以容器化思路解决大规模团队协作问题,实现并行开发、快速迭代和动态部署,适用于Android4.x以上系统版本的大小型App开发。
Atlas特别适用于大规模团队的协同开发。通过提供组件化、动态性、解耦化的支持,Atlas能够实现每个业务在开发阶段独立编译、独立调试、独立运行,最后再以一个组件的形式集成到客户端中,每个业务之间并行开发互不影响。此外,还具备客户端动态发版和快速修复的能力。
开源 性能:新进程的开辟极大影响每个业务的进入速度,同时由于手淘的插件并不是用完即走的场景,比如说从首页-聚划算-详情-店铺-下单各个环节是存在着一定的关联,各个插件的进程无法退出。而多进程的机制又极大的占用了内存,同时也引起许多用户的质疑
2. 复用:插件的独立限制了许多中间件的复用,aidl的方式并不适合中间件能力的输出,独立的apk直接进入的同时也携带了大量重复的二方库,也一方面极大增大的应用的体积
3. 稳定:插件化需要一个模拟的Android运行环境,在Android多版本以及国产rom的兼容中需要做大量的工作,同时多插件运行过程中在低端设备上很容易遇到进程被回收或者三方应用强杀的情况,没有良好的恢复机制会极大降低用户的体验。
组件化的诞生
伴随着allin的进行,在手淘内部发起了对大型app进行重构的计划。我们需要这样一个框架:
1. 支持大量丰富业务的接入,同时业务之间能够保持清晰的边界,各自可以继续灵活迭代;
2. 用一批统一的中间件去支撑起各种业务的底层功能,保持中间件代码的全面复用;
3. 能够尽量保持对系统的低侵入,尊重原生运行机制以降低后期的维护成本;
4. 在用户设备上尽量体现一个简单客户端的特性,同时特定的业务功能按需获取,保持体积的可控;
↑新容器化结构设想↑
基于对插件化框架对Android运行机制的理解,参考了OSGI在服务端框架,在开发IDE等领域"高复用、低耦合、可插拔"的优势,我们借鉴了OSGI规范开发了基于组件化的Atlas容器化框架。
下图是基于组件化框架的系统结构:
? 最底层的tookitverifier全面罗列了上层需要反射使用的注入和代理的Api,会在应用启动时先进性全局性的校验,以避免程序运行中遇到不兼容的情况;
? 往上BundleFramework负责组件的安装更新操作以及管理所有组件的生命周期,这里组件的边界隔离就遵循了OSGI的规范,每个组件分配独立的classloader,同时组件有各自的资源,每个资源在构建期间由AAPT分配独立的packageID;
? Runtime层主要包括清单管理、版本管理、以及系统代理三大块:
1. 版本:每个组件在构建期间就由构建插件分配自己的版本号,同时安装期间也有各自的版本目录,每个bundle的启动加载都需要经过版本的校验,组件发生更新同时也下发最新的版本信息。依托版本管理机制组件的热更新能力水到渠成。
2. 清单:OSGI规范中每个组件通常通过OSGI.MF来暴露自身的