方法1主要任務(wù):
- 做一些前期的檢查工作,設(shè)置一些生命周期回調(diào)監(jiān)聽,創(chuàng)建任務(wù)等操作。
- Gradle構(gòu)建生命周期中的Agp插件的配置流程:
1.
configureProject
:構(gòu)建project配置、2.
configureExtension
:配置外部Extension字段3.
createTasks
:創(chuàng)建Tasks
看第一階段:configureProject
private void configureProject() {
final Gradle gradle = project.getGradle();
//創(chuàng)建緩存版本變化的原因的字符串
Provider
- 這個(gè)方法主要是創(chuàng)建了一系列構(gòu)建需要的服務(wù),并將服務(wù)放到一個(gè)
globalScope
對(duì)象中,也算是一些前期準(zhǔn)備工作。
來看階段2:configureExtension
private void configureExtension() {
//獲取dsl服務(wù)
DslServices dslServices = globalScope.getDslServices();
//獲取構(gòu)建輸出
final NamedDomainObjectContainer
進(jìn)入createExtension
方法:
這個(gè)是抽象方法:具體實(shí)現(xiàn)是在子類AppPlugin中:
protected AppExtension createExtension(
@NonNull DslServices dslServices,
@NonNull GlobalScope globalScope,
@NonNull
DslContainerProvider
- 可以看到這里創(chuàng)建了一個(gè)‘
android
’的Extensions
,bean類型為:BaseAppModuleExtension
這個(gè)BaseAppModuleExtension
類就是我們可以在外部做擴(kuò)展的起始點(diǎn),這個(gè)類中有哪些屬性包括父類中的屬性都可以被擴(kuò)展:
進(jìn)到這個(gè)類中看看:
/** The `android` extension for base feature module (application plugin). */
open class BaseAppModuleExtension(...private val publicExtensionImpl: ApplicationExtensionImpl)
:AppExtension:InternalApplicationExtension by publicExtensionImpl,。。
看到該類繼承了AppExtension和InternalApplicationExtension(被ApplicationExtensionImpl代理)
AppExtension又繼承AbstractAppExtension繼承TestedExtension繼承BaseExtension
這幾個(gè)類組成了AGP所有的對(duì)外擴(kuò)展屬性
這里列舉幾個(gè)平時(shí)項(xiàng)目中開發(fā)用到的字段:
- 1.在
ApplicationExtensionImpl
中:
buildFeatures
屬性:
public open val buildFeatures:com.android.build.api.dsl.ApplicationBuildFeatures
查看ApplicationBuildFeatures中的代碼:
內(nèi)部就兩條屬性:
//用于dataBinding支持
var dataBinding: Boolean?
var mlModelBinding: Boolean?
ApplicationBuildFeatures 繼承 BuildFeatures
進(jìn)入BuildFeatures
看看:
可以看到這里面可以配置很多信息:
buildFeatures {
aidl = true
buildConfig = true
viewBinding = false
dataBinding = true
....
}
- 2.在AbstractAppExtension中
val applicationVariants: DomainObjectSet
這條屬性,可以讓我們?cè)谕獠揩@取到當(dāng)前所有變種:
DomainObjectSet
是一個(gè)集合,可以使用集合遍歷方式:
android.applicationVariants.all {variant->
variant.outputs.all {output->
outputFileName ="landi_dev_v${variant.versionName}_${variant.name}"+".apk"
}
}
相信這個(gè)代碼大家在自己項(xiàng)目中或多或少都見過
通過前面分析我們就知道:
variant = ApplicationVariant類對(duì)象
output = BaseVariantOutput類對(duì)象
關(guān)于configureExtension
就介紹到這
第3階段:createTasks
private void createTasks() {
threadRecorder.record(
ExecutionType.TASK_MANAGER_CREATE_TASKS,
project.getPath(),
null,
() ->
TaskManager.createTasksBeforeEvaluate(
globalScope,
variantFactory.getVariantType(),
extension.getSourceSets()));
project.afterEvaluate(
CrashReporting.afterEvaluate(
p -> {
variantInputModel.getSourceSetManager().runBuildableArtifactsActions();
threadRecorder.record(
ExecutionType.BASE_PLUGIN_CREATE_ANDROID_TASKS,
project.getPath(),
null,
this::createAndroidTasks);
}));
}
- 1.BeforeEvaluate:配置前創(chuàng)建一些task
- 2.afterEvaluate:配置后創(chuàng)建一些task:進(jìn)入createAndroidTasks看看:
final void createAndroidTasks() {
//使用variantManager創(chuàng)建變體 關(guān)注點(diǎn)1.。。
variantManager.createVariants();
//創(chuàng)建TaskManager 關(guān)注點(diǎn)2.。。
TaskManager
關(guān)注點(diǎn)1主要作用就是獲取所有的產(chǎn)品變體和buildTypes
,創(chuàng)建對(duì)應(yīng)的變體列表
關(guān)注點(diǎn)2:createTaskManager
抽象方法在子類AppPlugin
中實(shí)現(xiàn):
protected ApplicationTaskManager createTaskManager(
@NonNull
List
創(chuàng)建的是一個(gè)ApplicationTaskManager
類對(duì)象,后面會(huì)用到
來看關(guān)注點(diǎn)3:
這里面其實(shí)就是創(chuàng)建一系列的task,篇幅太長,不一一介紹
階段三:createTasks
主要任務(wù):
- 1.根據(jù)
Extensions
中的信息創(chuàng)建所有變體, - 2.給所有變體創(chuàng)建對(duì)應(yīng)的任務(wù):包括配置前任務(wù)和配置后的任務(wù)
總結(jié)我們的AGP
主要任務(wù):
- 1.創(chuàng)建了一系列構(gòu)建需要的服務(wù),并將服務(wù)放到一個(gè)
globalScope
對(duì)象中,作為前期準(zhǔn)備工作- 2.解析我們的外部擴(kuò)展android{}閉包中的信息,設(shè)置到Project中
- 3.根據(jù)buidTypes和產(chǎn)品變種創(chuàng)建對(duì)應(yīng)的變種信息,創(chuàng)建一系列的構(gòu)建任務(wù)。
-
AGP
+關(guān)注
關(guān)注
0文章
25瀏覽量
18270 -
開發(fā)
+關(guān)注
關(guān)注
0文章
370瀏覽量
40872 -
gradle
+關(guān)注
關(guān)注
0文章
26瀏覽量
728
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論