gradle是基于Apache Maven概念的项目自动化构建开源工具。他是使用一种基于groovy的 特定领域语言来声明项目配置,抛弃了 基于 XML的各种繁琐配置。
虽然gradle都是基于groovy的,但是由于其提供了一整套DSL,所以在开发gradle脚本时几乎脱离了groovy的感知。
-
groovy语法掌握
-
gradle生命周期
Gradle生命周期分为三个部分,如下:
- 初始化阶段: 解析整个工程中所有Project,构建所有的Project对应的project对象,这个阶段主要就是解析setting.gradle文件
- 配置阶段:解析所有的projects对象中的task,构建好所有的task拓扑图,主要解析各个project下的build.gradle文件
- 执行阶段:执行具体的的task及其依赖task
Gradle的生命周期的监听:
beforeEvaluate {
println "配置阶段开始"
}
afterEvaluate {
println "配置阶段完毕"
}
//等同于 beforeEvaluate
this.gradle.beforeProject {
println "配置阶段开始"
}
//等同于 afterEvaluate
this.gradle.afterProject {
println "配置阶段完毕"
}
//最后执行buildFinished
gradle.buildFinished {
println "执行阶段完毕"
}
-
配置gradle 仓库
在项目的根build.gradle文件中,配置需要从哪里的仓库下载jar包
repositories {
google()
jcenter()
}
repositories {
//构建项目时会拉取gradle资源,而goole和jcenter在国内的网络环境并不好,容易出现包拉取失败的问题,那么就可以使用国内阿里的镜像。
//repositories里仓库具有从上到下先后获取顺序
maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
maven{ url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
google()
jcenter()
}
-
自定义task
task taskName {
//do some things
}
定义简单task
//定义 task , 名字 hello
task hello {
println "hello world"
}
//定义 task,名字 hello
task(hello2) {
println "hello world2"
}
//定义 task,名字 hello3
task ('hello3') {
println "hello world3"
}
task 本质上又是由一组被顺序执行的 Action 对象构成,Action其实是一段代码块,类似于Java中的方法。
task actionUse {
//在Action 队列头部添加Action
doFirst {
}
//在Action 队列尾部添加Action
doLast {
}
//创建一个 Action , 添加到 Action 列表的头部
doFirst(new Action<Task>() {
@Override
void execute(Task task) {
}
})
}
-
引入gradle插件
apply plugin: 插件名 引入插件以后相当于包含了该插件所有的任务类型、任务、属性等。
-
在gradle文件中引入独立gradle文件:
apply from: '../xxx.gradle'
-
读取gradle.properties文件中数据
示例:读取gradle.properties中一个属性值NET_TYPE=dev,用来对应当前安装包的环境类型。
//使用文件流读取properties数据
def getServer() {
def netType
Properties properties = new Properties() //使用Properties读取流文件
def file = file("../gradle.properties") // file() 创建一个Java中的File对象
if (file.canRead()) {
//可以读取到文件
properties.load(file.newInputStream())
if (properties != null) {
//文件读取成功
netType = properties.getProperty('NET_TYPE') //getProperty读取属性值
}
}
return netType
}
-
往该模块的BuildConfig文件注入属性和值
//需要三个参数 1.属性类型(String/int) 2.属性名 3.属性值
//String类型,需要加入转义的双引号才表示字符串,不然生成的变量没有双引号
buildConfigField 'String', 'IS_DEV', "\"dev\""
buildConfigField 'String', 'IS_BETA', "\"beta\""
buildConfigField 'String', 'IS_RELEASE', "\"release\""
buildConfigField 'String', 'NET_TYPE', "\""+getServer()+"\"" //net_type读取properties中NET_TYPE值
在BuildConfig中生成了新的属性和值:
然后可以根据BuildConfig中类型来获取对应BaseUrl
/**
* 获取当前环境的域名
*/
fun getBaseUrl(): String {
return when (BuildConfig.NET_TYPE) {
BuildConfig.IS_DEV -> {
SERVER_ADDRESS_DEV
}
BuildConfig.IS_BETA -> {
SERVER_ADDRESS_BETA
}
BuildConfig.IS_RELEASE -> {
SERVER_ADDRESS_RELEASE
}
else -> SERVER_ADDRESS_DEV
}
}
-
自动配置签名信息
在app下的build.gradle文件的android{}中配置签名所需信息,可直接用gradle命令打包。
//签名配置
signingConfigs {
release {
keyAlias 'xxxx'
keyPassword 'xxx'
storeFile file('xxxx.jks')
storePassword 'xxxx'
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
-
多渠道配置,并将相关信息配置进apk名字
在app下的build.gradle文件中,配置一键化多渠道打包:
defaultConfig {
...
flavorDimensions "versionCode" //还需要配置多渠道打包code
}
productFlavors {
yingyongbao {}
qh360 {}
xiaomi {}
vivo {}
oppo {}
huawei {}
}
productFlavors.all { flavor->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
buildConfigField 'String', 'PLAT_FORM', "\"${name}\""
}
buildTypes {
release {
//通过Gradle生成apk名称,带有渠道名称,时间戳,版本号,版本名称等信息
android.applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "${new Date().format("yyyy-MM-dd")}_${defaultConfig.versionName}_release.apk"
}
}
}
}
参考:
https://www.bilibili.com/video/BV14541137MV?p=5&spm_id_from=pageDriver
网友评论