0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Gradle Plugin和AGP的区别3

jf_78858299 来源:小余的自习室 作者:小余的自习室 2023-03-30 11:50 次阅读

方法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
    AGP
    +关注

    关注

    0

    文章

    25

    浏览量

    18133
  • 开发
    +关注

    关注

    0

    文章

    340

    浏览量

    40586
  • gradle
    +关注

    关注

    0

    文章

    26

    浏览量

    656
收藏 人收藏

    评论

    相关推荐

    AGP总线

    ;PinA1RA2RB1RB2R1TYFEDT#12v5VOVRCNT#2USBGO-AGP8XUSB+5V3INTI#GNDINTB#GND4GNTRST#REQCLK5ST1VCC3.3ST0VCC3.36RESERVEDMB-AGP
    发表于 05-21 11:40

    Android Studio与Gradle深入

    。  上面提到的 settings.gradle 和 build.gradleGradle 平台中,其实都是一个 Groovy 对象。  Gradle 通过插件(
    发表于 08-31 17:58

    HarmonyOS初步探索04:使用DevEco Studio时设置Gradle仓库代替

    /huawei-gradlebuild/”} } 依赖项{ // gradle-intellij-plugin用于构建JetBrains插件//请确保始终升级到最新版本// http
    发表于 12-15 14:26

    xmake-gradle是什么?怎样去配置呢

    'org.tboox.gradle-xmake-plugin' version '1.1.5'}被废弃的插件集成方式buildscript {
    发表于 08-26 16:01

    AGP插槽,什么是AGP插槽,AGP插槽外形图

    AGP插槽,什么是AGP插槽,AGP插槽外形图 AGP(Accelerated Graphics Port)是在PCI总线基础上发展起来的,主要针对图形显示方面进行优化,专门用于图形
    发表于 04-26 18:15 2.3w次阅读

    AGP插槽

    AGP插槽 AGP(Accelerated Graphics Port)是在PCI总线基础上发展起来的,主要针对图形显示方面进行优化,专门用于图形显示卡。AGP标准也经过了几年的发展,从最初的
    发表于 12-24 15:22 886次阅读

    什么是AGP接口

    什么是AGP接口 AGP(Accelerate Graphical Port),加速图形接口。随着显示芯片的发展,PCI总
    发表于 12-25 10:31 1485次阅读

    Dexcount Gradle Plugin计算APK方法数量的Gradle插件

    ./oschina_soft/dexcount-gradle-plugin.zip
    发表于 06-13 09:53 1次下载
    Dexcount <b class='flag-5'>Gradle</b> <b class='flag-5'>Plugin</b>计算APK方法数量的<b class='flag-5'>Gradle</b>插件

    gradle和gradlew的区别

    你会注意到输出里打印了 Gradle 的版本,它对应着你运行的 gradle 命令在设备中的 Gradle 安装包版本。这听起来有点废话,但在谈论 gradlew 的时候需要明确这点,这很重要。
    的头像 发表于 12-13 09:57 891次阅读

    Gradle入门知识之Gradle详解

    大家回想一下自己第一次接触`Gradle`是什么时候? 相信大家也都是和我一样,在我们打开第一个AS项目的时候, 发现有很多带gradle字样的文件:`setting.gradle, build.
    的头像 发表于 03-30 10:47 2142次阅读
    <b class='flag-5'>Gradle</b>入门知识之<b class='flag-5'>Gradle</b>详解

    Gradle入门知识之Gradle语法1

    很多开发喜欢把`Gradle`简单定义为一种构建工具,和`ant,maven`等作用类似, 诚然Gradle确实是用来做构建,但是如果简单得把Gradle拿来做构建,就太小看Gradle
    的头像 发表于 03-30 10:54 786次阅读
    <b class='flag-5'>Gradle</b>入门知识之<b class='flag-5'>Gradle</b>语法1

    Gradle入门知识之Gradle语法2

    很多开发喜欢把`Gradle`简单定义为一种构建工具,和`ant,maven`等作用类似, 诚然Gradle确实是用来做构建,但是如果简单得把Gradle拿来做构建,就太小看Gradle
    的头像 发表于 03-30 10:54 554次阅读

    Gradle PluginAGP区别1

    Gradle Plugin`和`AGP`的区别? `Gradle Plugin`是`
    的头像 发表于 03-30 11:48 980次阅读
    <b class='flag-5'>Gradle</b> <b class='flag-5'>Plugin</b>和<b class='flag-5'>AGP</b>的<b class='flag-5'>区别</b>1

    Gradle PluginAGP区别2

    Gradle Plugin`和`AGP`的区别? `Gradle Plugin`是`
    的头像 发表于 03-30 11:49 884次阅读

    agp和pcie插槽区别 agp插槽插的组件是什么

    AGP(加速图形端口)和PCIe(Peripheral Component Interconnect Express)都是计算机插槽接口,用于连接显卡和主板。下面将分别介绍AGP和PCIe插槽的区别
    的头像 发表于 01-24 10:32 539次阅读