电子说
方法1主要任务:
1.
configureProject
:构建project配置、2.
configureExtension
:配置外部Extension字段3.
createTasks
:创建Tasks
private void configureProject() {
final Gradle gradle = project.getGradle();
//创建缓存版本变化的原因的字符串
Provider
globalScope
对象中,也算是一些前期准备工作。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所有的对外扩展属性
这里列举几个平时项目中开发用到的字段:
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
....
}
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
就介绍到这
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);
}));
}
final void createAndroidTasks() {
//使用variantManager创建变体 关注点1.。。
variantManager.createVariants();
//创建TaskManager 关注点2.。。
TaskManager
关注点1主要作用就是获取所有的产品变体和buildTypes
,创建对应的变体列表
关注点2:createTaskManager
抽象方法在子类AppPlugin
中实现:
protected ApplicationTaskManager createTaskManager(
@NonNull
List
创建的是一个ApplicationTaskManager
类对象,后面会用到
来看关注点3:
这里面其实就是创建一系列的task,篇幅太长,不一一介绍
阶段三:createTasks
主要任务:
Extensions
中的信息创建所有变体,总结我们的AGP
主要任务:
- 1.创建了一系列构建需要的服务,并将服务放到一个
globalScope
对象中,作为前期准备工作- 2.解析我们的外部扩展android{}闭包中的信息,设置到Project中
- 3.根据buidTypes和产品变种创建对应的变种信息,创建一系列的构建任务。
全部0条评论
快来发表一下你的评论吧 !