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