1、NamedDomainObjectContainer

BaseExtension 中的 buildType

  1. private final NamedDomainObjectContainer<BuildType> buildTypes;
android {

    buildTypes {
        release {
            // 是否开启混淆
            minifyEnabled true
            // 开启ZipAlign优化
            zipAlignEnabled true
            //去掉不用资源
            shrinkResources true
            // 混淆文件位置
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // 使用release签名
            signingConfig signingConfigs.hmiou
        }

        debug {
            signingConfig signingConfigs.hmiou
        }
    }
}

命名领域对象容器,翻译成中文的话。

2、each 和 all

all:NamedDomainObjectContainer
each:List、 Map

区别:
1、
all 会对集合内现有的元素和之后加入的原色,都执行给定的闭包操作
each 只会对集合内现有的元素执行给定的闭包操作

2、
all 接收的闭包,可以直接访问集合内元素的属性和方法
each 接收的闭包,不可以直接访问集合内元素的属性和方法

原因:
all 接收的闭包是一个配置闭包,集合内元素既会作为参数传给这个闭包,也会设为闭包的委托对象,这样闭包就可以直接访问对象(集合内元素)的属性和方法
each 接收的闭包只是一个普通的闭包,集合内元素只会作为参数传给这个闭包

参考网上的例子修改一个apk的名字

android {
    applicationVariants.all {
        it.outputs.all {
            outputFileName = "newName.apk"
        }
    }
}

如果改成 applicationVariants.each ,那么就会出现没有修改成功的情况,因为还没有配置。所以要加个前提那就是 afterEvaluate 。

afterEvaluate {
    android.applicationVariants.each {
        it.outputs.all {
            outputFileName = "newName.apk"
        }
    }
}

还有另一个问题,那就是each 不能调用元素的属性和方法。

afterEvaluate {
    android.applicationVariants.each {
        it.outputs.each {
            outputFileName = "newName.apk"
        }
    }
}
> Could not set unknown property 'outputFileName' for project ':app' of type org.gradle.api.Project.

android {
    applicationVariants.all {
        it.outputs.each {
            outputFileName = "newName.apk"
        }
    }
}
> groovy.lang.MissingPropertyException: Could not set unknown property 'outputFileName' for object of type com.android.build.gradle.internal.api.ApplicationVariantImpl.

3、project

image.png

image.png

4、ext

定义扩展属性

image.png
image.png
image.png

image.png

另一种方式

image.png

image.png
image.png

5、文件

getRootDir
getBuidlDir


copy{
from file('haha')
into getRootProject().getBuildDir() 
exclude{
}
rename{} 
}

image.png

6、buildscript

image.png

7、排除第三方冲突包

image.png

transitive false 解除第三方库对它的依赖的 传递给我们module 禁止传递依赖

image.png

8、外部命令

image.png