深入学习Gradle(一) Gradle配置⽂件拆解
2021-06-09 本文已影响0人
不思进取的码农
gradle 是什么
- 是构建⼯具,不是语⾔
- 它⽤了 Groovy 这个语⾔,创造了⼀种 DSL,但它本身不是语⾔
怎么构建?
- 按照 gradle 的规则(build.gradle、settings.gradle、gradle-wrapper、gradle
语法)
闭包
- Java 的 Lambda 表达式:是单抽象⽅法(SAM)的接⼝的匿名类对象的快捷写
法,只是⼀个语法糖。 - Kotlin 的 Lambda 表达式:和匿名函数相当,实质上是⼀个函数类型的对象,
并不只是语法糖。 - Groovy 的 Lambda 表达式:Groovy ⾥不叫「Lambda」表达式,⽽是叫「闭
包」;在功能上,和 Kotlin 的 Lambda ⽐较相似,都是⼀个「可以传递的代码
块」,具体的功能⽐ Kotlin 的 Lambda 更强⼀些,但基本的概念是⼀样的。
为什么 Groovy 可以写出类似 JSON 格式的配置?
因为它们其实都是⽅法调⽤,只是⽤闭包来写成了看起来像是 JSON 型的格式
buildTypes 和 productFlavors
-
buildTypes
在创建项目的文件中已经创建了buildTypes了,里面包含了一些release的配置,即我们发布apk的配置(主要是混淆文件)。我们也可以创建一个debug的版本的配置,使用默认的签名证书,通过Build Variant就可以看到
Build Variant
总结来说:主要就是配置发布版本和测试版本的一些配置以及混淆文件
- productFlavors
productFlavors直译为:产品的偏好.productFlavors是在buildTypes之外的纬度的分配.看起来和buildTypes的作用很像,但是他可以做更多维度
从维度的角度:免费版/付费版 国内版/国外版 渠道包等
flavorDimensions 'paid', 'country'
productFlavors {
free {
dimension "paid"
}
paid {
dimension "paid"
}
china {
applicationId "com.example.china" //动态配置包名
dimension "country"
buildConfigField "String" , "APP_URL" , "http://www.china.com" //给不同版本配置不同域名
buildConfigField "String" , "APP_NAME" , "小熊维尼" //不同维度不同名称
}
usa {
applicationId "com.example.usa" //动态配置包名
dimension "country"
buildConfigField "String" , "APP_URL" , "http://www.usa.com" //给不同版本配置不同域名
buildConfigField "String" , "APP_NAME" , "Winnie the Pooh"'//不同维度不同名称
}
compile, buildTypesimplementation 和 api
- implementation:不会传递依赖
- compile / api:会传递依赖;api 是 compile 的替代品,效果完全等同
- 当依赖被传递时,⼆级依赖的改动会导致 0 级项⽬重新编译;当依赖不传递
时,⼆级依赖的改动不会导致 0 级项⽬重新编译
Gradle Wrapper
- 通过「只同步版本,不同步⽂件」的⽅式来减⼩协作项⽬的⼤⼩
- 每个⼈电脑上的 Gradle 存放在固定位置,然后使⽤ Gradle Wrapper 的配置来
取⽤对应的版本就⾏了
task
- 使⽤⽅法:
./gradlew taskName
- task 的结构:
task taskName {
初始化代码
doFirst {
task 代码
}
doLast {
task 代码
}
}
-
doFirst() doLast() 和普通代码段的区别:
(1) 普通代码段:在 task 创建过程中就会被执⾏,发⽣在 codoFirst() 和 doLast():在 task 执⾏过程中被执⾏,发⽣在 段。如果⽤户没有直接或间接执⾏ task,那么它的 doLa不会被执⾏(2) doFirst() 和 doLast() 都是 task 代码,其中 doFirst() 是往码,doLast() 是往队列的后⾯插⼊代码
-
task 的依赖:可以使⽤
task taskA(dependsOn: b)
的指定依赖后task 会在⾃⼰执⾏前先执⾏⾃⼰依赖的 task。
gradle 执⾏的⽣命周期
三个阶段:
- 初始化阶段:执⾏ settings.gradle,确定主 project 和⼦ project
- 定义阶段:执⾏每个 project 的 bulid.gradle,确定出所有 task 所组成的有向⽆
环图 - 执⾏阶段:按照上⼀阶段所确定出的有向⽆环图来执⾏指定的 task
在阶段之间插⼊代码:
- ⼀⼆阶段之间:
settings.gradle 的最后 - ⼆三阶段之间:
afterEvaluate {
插⼊代码
}