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

  • 初始化阶段,创建项目的层次结构,并且为每一个项目创建一个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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349