上面兩篇文章值得多看幾遍,下面是簡單的總結(jié):
在build.gradle文件開始,有apply plugin,
apply plugin: 'com.android.application' //對(duì)應(yīng)apk
apply plugin: 'com.android.library' //對(duì)應(yīng)aar
調(diào)用鏈:
app工程 -> AppPlugin -> AppExtension
library工程 -> LibraryPlugin -> LibraryExtension
library工程和app工程類似,下面只看app工程
AppPlugin extends BasePlugin
查看BasePlugin 的 apply,主要執(zhí)行了這三步驟:
1.configureProject
2.configureExtension
3.createTasks
configureProject
主要作用:
- 進(jìn)行版本有效性的判斷。
- 創(chuàng)建了 AndroidBuilder 對(duì)象,后面用來合并manifest 和創(chuàng)建 dex 等作用。
- 設(shè)置了構(gòu)建流程的回調(diào)來處理依賴和dex的加載和緩存清理。
跟蹤代碼:
- project.afterEvaluate回調(diào)里執(zhí)行了setSdkLibData
- new AndroidBuilder
- getGradle().addBuildListener的finish回調(diào)里執(zhí)行PreDexCache的清理
- getGradle().getTaskGraph().addTaskExecutionGraphListener,將TransformTask加載進(jìn)PreDexCache
configureExtension
主要作用:
創(chuàng)建 Android 插件的擴(kuò)展對(duì)象,對(duì)配置項(xiàng) BuildType、ProductFlavor、SigningConfig 做了統(tǒng)一的創(chuàng)建和回調(diào)處理, 創(chuàng)建taskManager、variantFactory、variantManager。
android {
compileSdkVersion COMPILE_SDK_VERSION
……
defaultConfig {
……
}
buildTypes {
……
}
……
}
1、創(chuàng)建了 BuildType、ProductFlavor、SigningConfig 三個(gè)類型的Container
2、createExtension具體實(shí)現(xiàn)在AppPlugin里,這個(gè)方法就是創(chuàng)建android配置,將上面new出來的各個(gè)類傳進(jìn)去,最終生成AppExtension
3、之后創(chuàng)建了一些管理類
DependencyManager
NdkHandler
createTaskManager :就是創(chuàng)建具體任務(wù)的管理類
createVariantFactory
VariantManager:VariantFactory 構(gòu)建變體的工廠類,主要是生成Variant的對(duì)象
register ModelBuilder
注意:最下面是BuildType、ProductFlavor、SigningConfig 三個(gè)類型的Container增加whenObjectAdded監(jiān)聽,可以看到回調(diào)里都調(diào)用了variantManager::add……方法
createTasks
利用上面的兩種配置,進(jìn)行任務(wù)的創(chuàng)建。
任務(wù)有兩種,一個(gè)是在 beforeEvaluate 創(chuàng)建任務(wù);一個(gè)是在 afterEvaluate 創(chuàng)建任務(wù)。
beforeEvaluate跟我們編譯沒有太大關(guān)系。AndroidTask 是依賴配置項(xiàng)的配置才能生成相應(yīng)任務(wù),所以在afterEvaluate 回調(diào)里創(chuàng)建。
下面Gradle 提供的生命周期回調(diào)執(zhí)行順序:
settings:執(zhí)行settingsEvaluated...
settings:執(zhí)行projectsLoaded...
settings:執(zhí)行test beforeProject
根項(xiàng)目配置開始---
根項(xiàng)目里任務(wù)配置---
根項(xiàng)目配置結(jié)束---
settings:執(zhí)行test afterProject
settings:執(zhí)行app beforeProject
子項(xiàng)目beforeEvaluate回調(diào)...
APP子項(xiàng)目配置開始---
APP子項(xiàng)目里任務(wù)配置---
APP子項(xiàng)目配置結(jié)束---
settings:執(zhí)行app afterProject
APP子項(xiàng)目afterEvaluate回調(diào)...
settings: 執(zhí)行projectsEvaluated...
構(gòu)建結(jié)束...
createAndroidTasks -> variantManager的createAndroidTasks
if (variantDataList.isEmpty()) {
this::populateVariantDataList);//創(chuàng)建variantDataList
}
taskManager.createTopLevelTestTasks
createTasksForVariantData
populateVariantDataList 構(gòu)建變體任務(wù):
利用buildType 和 productFlavor ,構(gòu)建 variantData,舉例:
BuildType :release、debug
productFlavor:push、dot(打點(diǎn))
生成兩個(gè)variantData
{release+(push、dot)}、{debug+(push、dot)}
createTasksForVariantData :createAssembleTaskForVariantData方法
assemble任務(wù)
- 首先會(huì)先根據(jù) buildType 信息創(chuàng)建 assemble + buildType 的任務(wù),可以看下taskManager. createAssembleTask里的代碼
- 將assemble任務(wù)依賴于我們的assembleXXX任務(wù),創(chuàng)建 assemble + flavor + buildType 任務(wù),流程多了 productFlavor 任務(wù)的創(chuàng)建。
舉例:
創(chuàng)建assembleRelease,再創(chuàng)建assemblePushRelease,assembleDotRelease
創(chuàng)建assembleDebug,再創(chuàng)建assemblePushDebug,assembleDotDebug
createTasksForVariantData 的 taskManager.createTasksForVariantData方法:
生成 variantData 的一系列像 compileXXX、generateXXX、processXXX、mergeXXX的任務(wù),具體代碼再ApplicationTaskManager
在createPostCompilationTasks中,
如果設(shè)置了 minifyEnabled 為 true,會(huì)創(chuàng)建 createMinifyTransform ,
如果use proguard,這里會(huì)創(chuàng)建 progruad 的任務(wù)和 shrinkResources 的任務(wù)。
后面將創(chuàng)建 dexTask, 這個(gè)是 transfromTask 類型的任務(wù)
dexTask 中傳入的 transfrom 是DexTransfrom,會(huì)調(diào)用 DexTransfrom 的 transfrom ,
自定義的transfrom就是把主要邏輯寫在transform里。
transfrom方法執(zhí)行到androidBuilder.convertByteCode。主要做了:
1.通過執(zhí)行 processAllFiles ,內(nèi)部創(chuàng)建 DexFile 也就是outputDex,并且填充 class 文件
2.通過 writeDex 方法,將 outputDex 傳入,方法內(nèi)部執(zhí)行的是 outputDex.toDex 方法,將 outputDex 內(nèi)部填充的 class 轉(zhuǎn)化為 dex 的 byte[] 返回
3.最后將 byte[] 數(shù)組創(chuàng)建 classes.dex 輸出