美文网首页
Android Gradle 理解之Extension

Android Gradle 理解之Extension

作者: 暴走的小青春 | 来源:发表于2021-04-11 23:41 被阅读0次

在android的gradle的体系中,extension是很重要的一个知识点,可以说,理解了extension就能用语言的形式看待android.gradle文件了
首先我们都知道要给project赋值额外的属性,一般有两种方式
分别是gradle.properties和ext
例如

gradle.properties文件
PROJ_VERSION=0.0.1
# Automatically convert third-party libraries to use AndroidX

或者ext的写法

ext {
    extA = "3"
}

说到这里可能就有疑惑了,那ext可以变成extension么,为何一定要是ext呢?
其实这就牵扯到extension了,我们换种写法可能更加清晰

getProject().extensions.configure("ext") {
    org.gradle.internal.extensibility.DefaultExtraPropertiesExtension extProperties ->
        extProperties.setProperty("extA", "3")
}

可以看到写法2其实等同于写法1,只不过在写法一简洁了很多而已
那我们具体分析下getProject().extensions到底是何东西
这里主要看下它的configure方法

 public <T> void configure(String name, Action<? super T> action) {
        this.extensionsStorage.configureExtension(name, action);
    }

可以看到主要调用了extensionsStorage这个类,点开extensionsStorage类,发现了很明显的一个map

  private final Map<String, ExtensionsStorage.ExtensionHolder> extensions = new LinkedHashMap();

看如下:


屏幕快照 2021-04-11 下午11.18.28.png

可以看到
ext就是一开始存放的建,其值就是上文中说的DefaultExtraPropertiesExtension对象,
举个例子

def testExtension = getExtensions().create("test1", TestExtension, project)

这里我创建了test1的健,其值就是设定的TestExtension,至于上文中的setProperty方法,只不过是只不过是DefaultExtraPropertiesExtension这个对象的方法,当然,里面很明显保存了一个map来存放数据,可以看到
你在gradle.properties的简值对和ext的写法都保存在了这个map中

//DefaultExtraPropertiesExtension
 @Override
    public void setProperty(String name, @Nullable Object newValue) {
        if (name.equals("properties")) {
            throw new ReadOnlyPropertyException("name", ExtraPropertiesExtension.class);
        }
        set(name, newValue);
    }
 @Override
    public void set(String name, @Nullable Object value) {
        storage.put(name, value);
    }

这样一目了然了,当然在android.gradle中,也用类似的方法创建了android的标签

//AbstractAppPlugin
@NonNull
    @Override
    protected BaseExtension createExtension(
            @NonNull Project project,
            @NonNull ProjectOptions projectOptions,
            @NonNull GlobalScope globalScope,
            @NonNull NamedDomainObjectContainer<BuildType> buildTypeContainer,
            @NonNull NamedDomainObjectContainer<ProductFlavor> productFlavorContainer,
            @NonNull NamedDomainObjectContainer<SigningConfig> signingConfigContainer,
            @NonNull NamedDomainObjectContainer<BaseVariantOutput> buildOutputs,
            @NonNull SourceSetManager sourceSetManager,
            @NonNull ExtraModelInfo extraModelInfo) {
        return project.getExtensions()
                .create(
                        "android",
                        getExtensionClass(),
                        project,
                        projectOptions,
                        globalScope,
                        buildTypeContainer,
                        productFlavorContainer,
                        signingConfigContainer,
                        buildOutputs,
                        sourceSetManager,
                        extraModelInfo,
                        isBaseApplication);
    }

可以看到android的标签在初始化plugin的时候被创建出来,这里有牵扯到了NamedDomainObjectContainer类,其实这个和extension也有密不可分的连接,下篇文章详细讲下此类

相关文章

  • Android Gradle 理解之Extension

    在android的gradle的体系中,extension是很重要的一个知识点,可以说,理解了extension就...

  • 个人收藏

    Android 使用 Gradle 统一配置依赖管理 Android开发之深入理解Android Studio构建...

  • Gradle学习资料

    备份一下学习资料。 深入理解Android之Gradle Gradle User Guide 中文版 鸿洋提供

  • Gradle for Androider

    本文参考: 深入理解Android之Gradle[https://blog.csdn.net/innost/art...

  • Groovy介绍

    参考:深入理解Android之Gradle Groovy与Java的区别Groovy语法Groovy基础——Clo...

  • 理解Java、Groovy、Gradle的关系含义及Gradle

    理解Android开发中Gradle配置的含义及Gradle插件开发 [toc] 由于Gradle与Groo...

  • 第六周 Gradle

    话题:关于 Gradle 的知识 1、如何理解 Gradle?Gradle 在 Android 的构建过程中有什么...

  • 第6周

    1. 如何理解Gradle?Gradle在Android的构建过程中有什么作用? Gradle 是基于 Groov...

  • Android Gradle学习(五):Extension详解

    前面我们已经详细讲解了 Gradle 的 Task、Project 等基本用法,现在我们还要学习一个很重要的概念 ...

  • [转载]Gradle 完整指南(Android)

    前言 为什么需要学Gradle? Gradle 是 Android 现在主流的编译工具,虽然在Gradle 出现之...

网友评论

      本文标题:Android Gradle 理解之Extension

      本文链接:https://www.haomeiwen.com/subject/xwazkltx.html