Atlas plugin 5.5.1 是基于 gradle 版本 5.5.1 的 Android 构建脚本,包含了众多打包优化项与手淘自己打包的需求。
项目地址看这里:https://github.com/alibaba/atlas
其中,atlas-plugin 工程中有众多的插件,这里只对 com.taobao.atlas
插件进行源码解析,当然其他几个插件要么是已经没有对应的代码了,要么就是对 atlas 插件再次封装一层。
AtlasBasePlugin
既然是细谈,为了方便大家更轻松读懂代码,首先需要介绍 BasePlugin 怎么封装的?封装了哪些?
首先不用说,声明自己是一个插件(implements Plugin<Project>),其次是接收系统注入的 ToolingModelBuilderRegistry。
既然是一个插件,当运行起来后,系统会自动调用 apply 方法,这个方法内容很简单
- 通过监听项目生命周期,输出 Log
- 设置运行结束后,重置环境变量(AtlasBuildContext.reset())
- (子类)创建 AtlasConfigurationHelper
- 创建并设置 Extension,也就是接受传入的参数和配置
简而言之,继承 AtlasBasePlugin 就拥有了 log输出、运行后重置环境变量、使用 AtlasConfigurationHelper 接收并设置参数和设置的能力,并且在插件运行起来后自动就执行了。
AtlasPlugin
这个类是com.taobao.atlas
插件的入口类,可以从插件声明文件 properties文件知道。
这个插件里面我们先关注 apply 方法的内容是什么:
- super 执行父类中的配置
- 调用 AtlasConfigurationHelper 创建 compileProject 的依赖配置,并注入到project中
- 在配置结束后执行以下内容(afterEvaluate):
3.1. 通过 AtlasConfigurationHelper 创建 AndroidBuilder
3.2 通过 AtlasConfigurationHelper 注册 Transform,其中包括熟知的ap包、awb、solib等,对 Transform 不清楚的童鞋可以看这里
3.3 将依赖树按照 android/lib 分别存放在AtlasBuildContext 的两个 Map 中,以变种名为 key
3.4 更新一些 Extension 参数,其中最重要的根据 atlasEnabled && !(有FeaturePlugin || 有AtlasFeaturePlugin) 决定是否是否使用自定义 AAPT。
3.5 根据 project 类型配置需要执行的任务。
可能写到这里有点干,我稍稍注点水。Gradle 进行构建有 3 个生命周期,
- 初始化阶段,创建项目的层次结构,并且为每一个项目创建一个Project实例,在 Android
中每一个 module 就是一个 Project。 - 配置阶段,执行各项目下的build.gradle脚本,完成Project的配置,并且构造Task任务依赖关系图。
- 执行阶段,Gradle会根据任务Task的依赖关系创建一个有向无环图,可以通过Gradle对象的getTaskGraph方法访问,对应的类为TaskExecutionGraph,然后通过调用gradle <任务名>执行对应任务。
对于第一个阶段,Atlas 干涉并不多,而对于配置阶段,就需要将 Extension 等系列参数进行接收进来,创建后续需要的工具类 AtlasConfigurationHelper,声明依赖配置。到了前面配置结束,就需要对需要运行的任务进行准备,设置并运行对应的 Tasks,注意,这一部分同样属于配置阶段,直到Tasks设置完毕,Tasks配置执行结束,配置阶段才算结束。而声明对应的 Transform 就是为了在编译后的类文件转换为dex文件之前做一些手淘特需的处理操作,例如打ap包等。
AtlasAppTaskManager
这一个类和其基类 AtlasBaseTaskManager 是对任务管理的封装,AtlasBaseTaskManager 调用run进行执行,整体分为3个步骤
- resolveDependencies,依赖项处理
- parseConfig,配置项处理
- runTask,执行所有添加的任务
在 AtlasAppTaskManager 中的依赖项处理为空实现,默认不处理。
在 AtlasAppTaskManager 中的配置项处理为空实现,默认使用先前的配置。
执行任务内容主要有以下内容:
1. 主 dex
当一个 project 是 Application 的时候,需要设置 AtlasMainDexHelper。但是单从 Atlas 6.0.0 分支代码来看,只是进行了设置,并没有进行对主dex的处理。2. 替换 AndroidBuilder
3. 摩天轮任务列表注入
任务类名 | 执行条件 | 任务含义 |
---|---|---|
AppPreBuildTask | 系统任务,把所有的依赖拿出来检查一遍 | |
BuildAtlasEnvTask | Atlas 环境,主要包括依赖库,主dex,res,assets | |
ScanDupResTask | 扫描重复资源,以文件形式给出 | |
LogDependenciesTask | 记录依赖信息 | |
PrepareAPTask | 打AP包,根据AP基准包,apDependency,awbBundles等打AP包 | |
StandardizeLibManifestTask | 预处理 manifest | |
MtlFeatureSetmetadataWriterTask | appBundlesEnabled=true | |
MtlModuleMetadataWriterTask.CreationAction | appBundlesEnabled=true | |
FeaturesParallelTask.CreationManifestsAction | appBundlesEnabled=true | |
MergeSourceSetFolders | 将相应的目录下的文件merge到一个指定的目录下 | |
FeaturesParallelTask.CreationAssetsAction | appBundlesEnabled=true | |
FeaturesParallelTask.MergeResourceAction | appBundlesEnabled=true | |
RenderscriptCompile | 系统任务,编译Renderscript文件的任务,Renderscript介绍 | |
PrepareBundleInfoTask | 收集并设置bundle信息,生成bundleList.cfg | |
GenerateBundleInfoSourceTask | atlasEnabled=true | |
PreparePackageIdsTask | 设置PackageId | |
PrepareAaptTask | aapt相关任务,当前分支主要是设置AaptOptions | |
AidlCompile | 系统任务,调用aidl工具生成了java源文件 | |
GenerateBuildConfig | 系统任务,生成 BuildConfig 文件 | |
ProcessApplicationManifest | 系统任务,处理 manifest | |
LinkAndroidResForBundleTask | appBundlesEnabled=true | |
ProcessAndroidResources | 系统任务,处理资源和创建R文件 | |
AndroidJavaCompile | appBundlesEnabled=true | |
ProcessJavaResTask | appBundlesEnabled=true | |
FeaturesParallelTask.CreationBundleResourceAction | appBundlesEnabled=true | |
FeaturesParallelTask.CreationProcessResourceAction | appBundlesEnabled=true | |
FeaturesParallelTask.CreationFeatureCompileAction | appBundlesEnabled=true | |
TransformTask | transform | |
PerModuleBundleTask | appBundlesEnabled=true | |
FeaturesParallelTask.CreationPreBundleAction | appBundlesEnabled=true | |
MtlPerModuleReportDependenciesTask | appBundlesEnabled=true | |
FeaturesParallelTask.CreationBundleDepsAction | appBundlesEnabled=true | |
BundleReportDependenciesTask | appBundlesEnabled=true | |
MtlPackageBundleTask.CreationAction | appBundlesEnabled=true | |
FinalizeBundleTask | appBundlesEnabled=true | |
BundleToApkTask | appBundlesEnabled=true | |
BundleToStandaloneApkTask | appBundlesEnabled=true | |
PackageApplication | 打包apk | |
ApBuildTask | 打AP包 | |
assemble | 生成构件产物(Apk) |
- 4. Transform 注入,这里的transform的任务和最开始注册进来的任务不冲突。
任务类名 |
---|
R8Transform |
MergeJavaResourcesTransform |
ExtractJarsTransform |
InstantRunTransform |
任务较多,而执行到这个阶段需要注意,这部分代码,有一部分会在配置阶段时执行,有一部分会在运行时执行。与此同时,需要注意,每一个 Task 对应的配置静态类一般与 Task 写在一起。
AtlasLibTaskManager
AtlasLibTaskManager 同 AtlasAppTaskManager 相同,都是对任务管理的封装,也是继承于同一个基类,唯一实现方法 runTask。
runTask 主要干了以下几件事:
generatePomFileForMavenPublication 任务之后更新 pom
jarEnabled==true,生成Artifict Jar
awbBundle==true,生成awb