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

2020-06-30  本文已影响0人  墨染书

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 方法,这个方法内容很简单

  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 个生命周期,

对于第一个阶段,Atlas 干涉并不多,而对于配置阶段,就需要将 Extension 等系列参数进行接收进来,创建后续需要的工具类 AtlasConfigurationHelper,声明依赖配置。到了前面配置结束,就需要对需要运行的任务进行准备,设置并运行对应的 Tasks,注意,这一部分同样属于配置阶段,直到Tasks设置完毕,Tasks配置执行结束,配置阶段才算结束。而声明对应的 Transform 就是为了在编译后的类文件转换为dex文件之前做一些手淘特需的处理操作,例如打ap包等。

AtlasAppTaskManager

这一个类和其基类 AtlasBaseTaskManager 是对任务管理的封装,AtlasBaseTaskManager 调用run进行执行,整体分为3个步骤

  1. resolveDependencies,依赖项处理
  2. parseConfig,配置项处理
  3. runTask,执行所有添加的任务

在 AtlasAppTaskManager 中的依赖项处理为空实现,默认不处理。

在 AtlasAppTaskManager 中的配置项处理为空实现,默认使用先前的配置。

执行任务内容主要有以下内容:

任务类名 执行条件 任务含义
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)
任务类名
R8Transform
MergeJavaResourcesTransform
ExtractJarsTransform
InstantRunTransform

任务较多,而执行到这个阶段需要注意,这部分代码,有一部分会在配置阶段时执行,有一部分会在运行时执行。与此同时,需要注意,每一个 Task 对应的配置静态类一般与 Task 写在一起。

AtlasLibTaskManager

AtlasLibTaskManager 同 AtlasAppTaskManager 相同,都是对任务管理的封装,也是继承于同一个基类,唯一实现方法 runTask。

runTask 主要干了以下几件事:

  1. generatePomFileForMavenPublication 任务之后更新 pom

  2. jarEnabled==true,生成Artifict Jar

  3. awbBundle==true,生成awb

上一篇下一篇

猜你喜欢

热点阅读