Android组件化容器框架Atlas
Atlas基本简介
Atlas是伴随着手机淘宝的不断发展而衍生出来的一个运行于Android系统上的一个容器化框架,我们也叫动态组件化(Dynamic Bundle)框架。它主要提供了解耦化、组件化、动态性的支持。覆盖了工程师的工程编码期、Apk运行期以及后续运维期的各种问题。
与插件化框架不同的是,Atlas是一个组件框架,Atlas不是一个多进程的框架,他主要完成的就是在运行环境中按需地去完成各个bundle的安装,加载类和资源。
官网:http://atlas.taobao.org/
文档:https://alibaba.github.io/atlas/
Github:https://github.com/alibaba/atlas
Atlas对app的划分
拆分 | 定位 | 说明 |
---|---|---|
host | 基础支持 | 包含独立的中间件,以及一个Base的工程, 里面可能包含应用的Application,应用icon等基础性内容 |
bundle | 业务层基本单位 | 运行期按需动态加载。 bundle可以调用host的代码和资源,同时bundle之间允许存在依赖关系 |
Atlas能做什么
- 工程模块的独立加载和运行
- 及时上线新需求、快速迭代
- 业务灰度与技术灰度的快速验证
- 动态修复线上故障
- 有问题及时回滚
从app的开发期 -> 运行期 -> 上线后的运维期,Atlas提供了一整套完整的支持
周期 | 说明 |
---|---|
工程期 | 实现host、bundle独立开发、调试的功能,bundle独立 |
运行期 | 实现完整的组件生命周期的映射,类隔离、资源共享等机制 |
运维期 | 增量更新修复能力,提供对class、so以及资源的增量更新修复能力,快速升级 |
Atlas诞生背景
随着手机淘宝业务的快速增长,协作研发团队的不断扩大,技术也面临着更多挑战:一方面代码量快速上升导致方法过多,限制打包的正常输出;另一个方面各业务线的开发和集成都需要到一个apk上,业务间相互耦合严重,集成开发工作效率低下。这个大背景下,急需要做一次从构建、集成、交付的技术改造,于是Atlas作为手淘运行的容器诞生了,它灵活的解决了各个业务开发期间的相互独立解耦,而且提供了各个模块线上独立动态能力。
Atlas功能原理
Atlas类加载机制(加载顺序):
- 查找自身内部的class(DelegateClassLoader)
- 查找bundle依赖的bundle内的class(BundleClassLoader)
- 查找主apk中的class(PathClassLoader)
Bundle:类似OSGI规范里面bundle(组件)的概念,每个bundle有自己的classloader,与其他bundle相隔离,同时Atlas框架下bundle有自身的资源段(PackageID,打包时AAPT指定);另外与原有OSGI所定义的service格式不同之处是Atlas里面Bundle透出所有定义在Manifest里面的component,随着service,activity的触发执行bundle的安装,运行。
awb:Android Wireless Bundle
的缩写,实际上同AAR类似,是最终构建整包前的中间产物。每个awb最终会打成一个bundle。awb与aar的唯一不同之处是awb与之对应有个packageId的定义。
host:宿主的概念,所有的bundle可以直接调用host内的代码和资源,所以host常常集合了公共的中间件,UI资源等。
Atlas接入
引用Atlas插件及依赖仓库,修改工程的build.gradle
(1)注释默认的gradle-plugin
,添加atlasplugin
buildscript {
repositories { jcenter() }
dependencies {
//classpath 'com.android.tools.build:gradle:3.1.3'
classpath "com.taobao.android:atlasplugin:2.3.3.rc63"
}
}
(2)gradle版本使用3.3
修改文件:gradle\wrapper\gradle-wrapper.properties
参考:https://github.com/alibaba/atlas/issues/231
有两个概念com.android.tools.build:gradle:2.3.3
和gradle
的版本。前者是google原生的android打包插件,是基于gradle运行的。Atlas修改了原生的打包插件。所以只需要依赖atlasplugin
即可。目前的atlasplugin
是基于com.android.tools.build:gradle:2.3.3
改的,它需要的gradle
版本是3.3。
bundle接入,修改bundle的build.gradle
apply plugin: 'com.taobao.atlas'
atlas {
//声明为awb 即bundle工程
bundleConfig { awbBundle true }
}
容器接入,修改app模块的build.gradle
apply plugin: 'com.taobao.atlas'
dependencies {
//核心sdk
compile('com.taobao.android:atlas_core:5.0.0@aar') {
transitive = true
}
//如果不需要用到atlas的动态部署功能,不需要依赖atlasupdate
compile 'com.taobao.android:atlasupdate:1.0.8@aar'
//设置bundle依赖
bundleCompile project(':firstbundle')
}
atlas {
atlasEnabled true
//...
}
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/18/android-componentized-container-framework-atlas/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论