Gradle Plugin和AGP的区别3

电子说

1.2w人已加入

描述

方法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和产品变种创建对应的变种信息,创建一系列的构建任务。
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分