Atlas plugin dev-5.5.1 源码细谈(1)整体框架

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),其次是接收系统注入的 ToolingModelBuilderRegistry。

既然是一个插件,当运行起来后,系统会自动调用 apply 方法,这个方法内容很简单

  1. 通过监听项目生命周期,输出 Log
  2. 设置运行结束后,重置环境变量(AtlasBuildContext.reset())
  3. (子类)创建 AtlasConfigurationHelper
  4. 创建并设置 Extension,也就是接受传入的参数和配置

简而言之,继承 AtlasBasePlugin 就拥有了 log输出、运行后重置环境变量、使用 AtlasConfigurationHelper 接收并设置参数和设置的能力,并且在插件运行起来后自动就执行了。

AtlasPlugin

这个类是com.taobao.atlas插件的入口类,可以从插件声明文件 properties文件知道。

这个插件里面我们先关注 apply 方法的内容是什么:

  1. super 执行父类中的配置
  2. 调用 AtlasConfigurationHelper 创建 compileProject 的依赖配置,并注入到project中
  3. 在配置结束后执行以下内容(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个步骤

  1. resolveDependencies,依赖项处理
  2. parseConfig,配置项处理
  3. 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 主要干了以下几件事:

  1. generatePomFileForMavenPublication 任务之后更新 pom

  2. jarEnabled==true,生成Artifict Jar

  3. awbBundle==true,生成awb

你可能感兴趣的:(Atlas plugin dev-5.5.1 源码细谈(1)整体框架)