美文网首页
Atlas plugin dev-5.5.1 源码细谈(1)整体

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

作者: 墨染书 | 来源:发表于2020-06-30 17:09 被阅读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 个生命周期,

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

          本文链接:https://www.haomeiwen.com/subject/pcwxqktx.html