Atlas plugin 5.5.1 是基于 gradle 版本 5.5.1 的 Android 構(gòu)建腳本全肮,包含了眾多打包優(yōu)化項(xiàng)與手淘自己打包的需求。
項(xiàng)目地址看這里:https://github.com/alibaba/atlas
其中棘捣,atlas-plugin 工程中有眾多的插件辜腺,這里只對 com.taobao.atlas
插件進(jìn)行源碼解析,當(dāng)然其他幾個插件要么是已經(jīng)沒有對應(yīng)的代碼了乍恐,要么就是對 atlas 插件再次封裝一層评疗。
AtlasBasePlugin
既然是細(xì)談,為了方便大家更輕松讀懂代碼茵烈,首先需要介紹 BasePlugin 怎么封裝的百匆?封裝了哪些?
首先不用說呜投,聲明自己是一個插件(implements Plugin<Project>)加匈,其次是接收系統(tǒng)注入的 ToolingModelBuilderRegistry。
既然是一個插件宙彪,當(dāng)運(yùn)行起來后矩动,系統(tǒng)會自動調(diào)用 apply 方法有巧,這個方法內(nèi)容很簡單
- 通過監(jiān)聽項(xiàng)目生命周期释漆,輸出 Log
- 設(shè)置運(yùn)行結(jié)束后,重置環(huán)境變量(AtlasBuildContext.reset())
- (子類)創(chuàng)建 AtlasConfigurationHelper
- 創(chuàng)建并設(shè)置 Extension篮迎,也就是接受傳入的參數(shù)和配置
簡而言之男图,繼承 AtlasBasePlugin 就擁有了 log輸出、運(yùn)行后重置環(huán)境變量甜橱、使用 AtlasConfigurationHelper 接收并設(shè)置參數(shù)和設(shè)置的能力逊笆,并且在插件運(yùn)行起來后自動就執(zhí)行了。
AtlasPlugin
這個類是com.taobao.atlas
插件的入口類岂傲,可以從插件聲明文件 properties文件知道难裆。
這個插件里面我們先關(guān)注 apply 方法的內(nèi)容是什么:
- super 執(zhí)行父類中的配置
- 調(diào)用 AtlasConfigurationHelper 創(chuàng)建 compileProject 的依賴配置,并注入到project中
- 在配置結(jié)束后執(zhí)行以下內(nèi)容(afterEvaluate):
3.1. 通過 AtlasConfigurationHelper 創(chuàng)建 AndroidBuilder
3.2 通過 AtlasConfigurationHelper 注冊 Transform镊掖,其中包括熟知的ap包乃戈、awb、solib等亩进,對 Transform 不清楚的童鞋可以看這里
3.3 將依賴樹按照 android/lib 分別存放在AtlasBuildContext 的兩個 Map 中症虑,以變種名為 key
3.4 更新一些 Extension 參數(shù),其中最重要的根據(jù) atlasEnabled && !(有FeaturePlugin || 有AtlasFeaturePlugin) 決定是否是否使用自定義 AAPT归薛。
3.5 根據(jù) project 類型配置需要執(zhí)行的任務(wù)谍憔。
可能寫到這里有點(diǎn)干匪蝙,我稍稍注點(diǎn)水。Gradle 進(jìn)行構(gòu)建有 3 個生命周期习贫,
- 初始化階段逛球,創(chuàng)建項(xiàng)目的層次結(jié)構(gòu),并且為每一個項(xiàng)目創(chuàng)建一個Project實(shí)例苫昌,在 Android
中每一個 module 就是一個 Project需忿。 - 配置階段,執(zhí)行各項(xiàng)目下的build.gradle腳本蜡歹,完成Project的配置屋厘,并且構(gòu)造Task任務(wù)依賴關(guān)系圖。
- 執(zhí)行階段月而,Gradle會根據(jù)任務(wù)Task的依賴關(guān)系創(chuàng)建一個有向無環(huán)圖汗洒,可以通過Gradle對象的getTaskGraph方法訪問,對應(yīng)的類為TaskExecutionGraph父款,然后通過調(diào)用gradle <任務(wù)名>執(zhí)行對應(yīng)任務(wù)溢谤。
對于第一個階段,Atlas 干涉并不多憨攒,而對于配置階段世杀,就需要將 Extension 等系列參數(shù)進(jìn)行接收進(jìn)來,創(chuàng)建后續(xù)需要的工具類 AtlasConfigurationHelper肝集,聲明依賴配置瞻坝。到了前面配置結(jié)束,就需要對需要運(yùn)行的任務(wù)進(jìn)行準(zhǔn)備杏瞻,設(shè)置并運(yùn)行對應(yīng)的 Tasks所刀,注意,這一部分同樣屬于配置階段捞挥,直到Tasks設(shè)置完畢浮创,Tasks配置執(zhí)行結(jié)束,配置階段才算結(jié)束砌函。而聲明對應(yīng)的 Transform 就是為了在編譯后的類文件轉(zhuǎn)換為dex文件之前做一些手淘特需的處理操作斩披,例如打ap包等。
AtlasAppTaskManager
這一個類和其基類 AtlasBaseTaskManager 是對任務(wù)管理的封裝讹俊,AtlasBaseTaskManager 調(diào)用run進(jìn)行執(zhí)行垦沉,整體分為3個步驟
- resolveDependencies,依賴項(xiàng)處理
- parseConfig劣像,配置項(xiàng)處理
- runTask乡话,執(zhí)行所有添加的任務(wù)
在 AtlasAppTaskManager 中的依賴項(xiàng)處理為空實(shí)現(xiàn),默認(rèn)不處理耳奕。
在 AtlasAppTaskManager 中的配置項(xiàng)處理為空實(shí)現(xiàn)绑青,默認(rèn)使用先前的配置诬像。
執(zhí)行任務(wù)內(nèi)容主要有以下內(nèi)容:
1. 主 dex
當(dāng)一個 project 是 Application 的時候,需要設(shè)置 AtlasMainDexHelper闸婴。但是單從 Atlas 6.0.0 分支代碼來看坏挠,只是進(jìn)行了設(shè)置,并沒有進(jìn)行對主dex的處理邪乍。2. 替換 AndroidBuilder
3. 摩天輪任務(wù)列表注入
任務(wù)類名 | 執(zhí)行條件 | 任務(wù)含義 |
---|---|---|
AppPreBuildTask | 系統(tǒng)任務(wù)降狠,把所有的依賴拿出來檢查一遍 | |
BuildAtlasEnvTask | Atlas 環(huán)境,主要包括依賴庫庇楞,主dex榜配,res,assets | |
ScanDupResTask | 掃描重復(fù)資源吕晌,以文件形式給出 | |
LogDependenciesTask | 記錄依賴信息 | |
PrepareAPTask | 打AP包蛋褥,根據(jù)AP基準(zhǔn)包,apDependency睛驳,awbBundles等打AP包 | |
StandardizeLibManifestTask | 預(yù)處理 manifest | |
MtlFeatureSetmetadataWriterTask | appBundlesEnabled=true | |
MtlModuleMetadataWriterTask.CreationAction | appBundlesEnabled=true | |
FeaturesParallelTask.CreationManifestsAction | appBundlesEnabled=true | |
MergeSourceSetFolders | 將相應(yīng)的目錄下的文件merge到一個指定的目錄下 | |
FeaturesParallelTask.CreationAssetsAction | appBundlesEnabled=true | |
FeaturesParallelTask.MergeResourceAction | appBundlesEnabled=true | |
RenderscriptCompile | 系統(tǒng)任務(wù)烙心,編譯Renderscript文件的任務(wù),Renderscript介紹 | |
PrepareBundleInfoTask | 收集并設(shè)置bundle信息乏沸,生成bundleList.cfg | |
GenerateBundleInfoSourceTask | atlasEnabled=true | |
PreparePackageIdsTask | 設(shè)置PackageId | |
PrepareAaptTask | aapt相關(guān)任務(wù)淫茵,當(dāng)前分支主要是設(shè)置AaptOptions | |
AidlCompile | 系統(tǒng)任務(wù),調(diào)用aidl工具生成了java源文件 | |
GenerateBuildConfig | 系統(tǒng)任務(wù)蹬跃,生成 BuildConfig 文件 | |
ProcessApplicationManifest | 系統(tǒng)任務(wù)匙瘪,處理 manifest | |
LinkAndroidResForBundleTask | appBundlesEnabled=true | |
ProcessAndroidResources | 系統(tǒng)任務(wù),處理資源和創(chuàng)建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 | 生成構(gòu)件產(chǎn)物(Apk) |
- 4. Transform 注入炬转,這里的transform的任務(wù)和最開始注冊進(jìn)來的任務(wù)不沖突辆苔。
任務(wù)類名 |
---|
R8Transform |
MergeJavaResourcesTransform |
ExtractJarsTransform |
InstantRunTransform |
任務(wù)較多算灸,而執(zhí)行到這個階段需要注意扼劈,這部分代碼,有一部分會在配置階段時執(zhí)行菲驴,有一部分會在運(yùn)行時執(zhí)行荐吵。與此同時,需要注意赊瞬,每一個 Task 對應(yīng)的配置靜態(tài)類一般與 Task 寫在一起先煎。
AtlasLibTaskManager
AtlasLibTaskManager 同 AtlasAppTaskManager 相同,都是對任務(wù)管理的封裝巧涧,也是繼承于同一個基類薯蝎,唯一實(shí)現(xiàn)方法 runTask。
runTask 主要干了以下幾件事:
generatePomFileForMavenPublication 任務(wù)之后更新 pom
jarEnabled==true谤绳,生成Artifict Jar
awbBundle==true占锯,生成awb