方法1主要任務:
- 做一些前期的檢查工作,設置一些生命周期回調監聽,創建任務等操作。
- Gradle構建生命周期中的Agp插件的配置流程:
1.
configureProject
:構建project配置、2.
configureExtension
:配置外部Extension字段3.
createTasks
:創建Tasks
看第一階段:configureProject
private void configureProject() {
final Gradle gradle = project.getGradle();
//創建緩存版本變化的原因的字符串
Provider
- 這個方法主要是創建了一系列構建需要的服務,并將服務放到一個
globalScope
對象中,也算是一些前期準備工作。
來看階段2:configureExtension
private void configureExtension() {
//獲取dsl服務
DslServices dslServices = globalScope.getDslServices();
//獲取構建輸出
final NamedDomainObjectContainer
進入createExtension
方法:
這個是抽象方法:具體實現是在子類AppPlugin中:
protected AppExtension createExtension(
@NonNull DslServices dslServices,
@NonNull GlobalScope globalScope,
@NonNull
DslContainerProvider
- 可以看到這里創建了一個‘
android
’的Extensions
,bean類型為:BaseAppModuleExtension
這個BaseAppModuleExtension
類就是我們可以在外部做擴展的起始點,這個類中有哪些屬性包括父類中的屬性都可以被擴展:
進到這個類中看看:
/** 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
這幾個類組成了AGP所有的對外擴展屬性
這里列舉幾個平時項目中開發用到的字段:
- 1.在
ApplicationExtensionImpl
中:
buildFeatures
屬性:
public open val buildFeatures:com.android.build.api.dsl.ApplicationBuildFeatures
查看ApplicationBuildFeatures中的代碼:
內部就兩條屬性:
//用于dataBinding支持
var dataBinding: Boolean?
var mlModelBinding: Boolean?
ApplicationBuildFeatures 繼承 BuildFeatures
進入BuildFeatures
看看:
可以看到這里面可以配置很多信息:
buildFeatures {
aidl = true
buildConfig = true
viewBinding = false
dataBinding = true
....
}
- 2.在AbstractAppExtension中
val applicationVariants: DomainObjectSet
這條屬性,可以讓我們在外部獲取到當前所有變種:
DomainObjectSet
是一個集合,可以使用集合遍歷方式:
android.applicationVariants.all {variant->
variant.outputs.all {output->
outputFileName ="landi_dev_v${variant.versionName}_${variant.name}"+".apk"
}
}
相信這個代碼大家在自己項目中或多或少都見過
通過前面分析我們就知道:
variant = ApplicationVariant類對象
output = BaseVariantOutput類對象
關于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:配置前創建一些task
- 2.afterEvaluate:配置后創建一些task:進入createAndroidTasks看看:
final void createAndroidTasks() {
//使用variantManager創建變體 關注點1.。。
variantManager.createVariants();
//創建TaskManager 關注點2.。。
TaskManager
關注點1主要作用就是獲取所有的產品變體和buildTypes
,創建對應的變體列表
關注點2:createTaskManager
抽象方法在子類AppPlugin
中實現:
protected ApplicationTaskManager createTaskManager(
@NonNull
List
創建的是一個ApplicationTaskManager
類對象,后面會用到
來看關注點3:
這里面其實就是創建一系列的task,篇幅太長,不一一介紹
階段三:createTasks
主要任務:
- 1.根據
Extensions
中的信息創建所有變體, - 2.給所有變體創建對應的任務:包括配置前任務和配置后的任務
總結我們的AGP
主要任務:
- 1.創建了一系列構建需要的服務,并將服務放到一個
globalScope
對象中,作為前期準備工作- 2.解析我們的外部擴展android{}閉包中的信息,設置到Project中
- 3.根據buidTypes和產品變種創建對應的變種信息,創建一系列的構建任務。
-
AGP
+關注
關注
0文章
25瀏覽量
18288 -
開發
+關注
關注
0文章
370瀏覽量
40920 -
gradle
+關注
關注
0文章
26瀏覽量
741
發布評論請先 登錄
相關推薦
評論