一:简介
Gradle是一款基于Apache Ant和Apache Maven概念的项目开源构建工具,基于Groovy语言来实现,很方便的通过代码达到构建目的,执行Gradle任务的过程,主要是在运行Java/Groovy代码。Gradle构建的大部分功能都是通过插件的方式来实现。
二:Android Gradle
Android Gradle 插件属于第三方插件,它托管在Jcenter上,所以在使用之前需要配置依赖classpath,使用时根据classpath去Jcenter库中去查找对应的版本。
Android Studio中默认会使用 Gradle Wrapper 而不是直接使用Gradle。命令也是使用gradlew而不是gradle。这是因为gradle针对特定的开发环境的构建脚本,新的gradle可能不能兼容旧版的构建环境。为了解决这个问题,使用Gradle Wrapper 来间接使用 gradle。相当于在外边包裹了一个中间层。对开发者来说,直接使用Gradlew 即可,不需要关心 gradle的版本变化。Gradle Wrapper 会负责下载合适的的gradle版本来构建项目。
Gradle基础文件配置
每个gradle都包含以下的基础文件
- setting.gradle
定义哪些moudle被加入到编译过程
- moudle build.gradle
定义每个moudle的配置信息
- project build.gradle
项目的build.gradle文件中的配置应用于所有moudle,全局属性
buildscript:定义了Android编译工具的类路径,repositories中是引用的仓库;dependencies中配置gradle的编译工具
allprojects:定义的属性应用到所有的moudle中
Gradle中的属性及含义
1:apply plugin:位于第一行代码,应用了Android程序的gradle插件,提供Android的编译、打包等task
2:android android的所有配置,由声明的plugin提供
- defaultConfig 程序的默认配置,如果与清单文件定义的属性相同,会以这里的为主
1》testApplicationId
用于配置测试App的包名,默认情况下是applicationId+".test"
2》applicationId 当前程序的ID,修改后生成资源文件的包名不变;清单文件中的会同时修改资源类的包名
3》minSdkVersion / targetSdkVersion sdk最低版本/sdk最高版本
- buildTypes 定义编译apk的类型,根据不同的配置
构建应用类型debug 、release,两种模式区别在于能否在设备上调试以及签名不一样,其他代码和文件资源都是一样的
属性:
1》applicationIdSuffix
是它的一个属性,用于配置基于默认applicationId的后缀,比如applicationId = com.example.test 此属性的值指定为.debug后,最后生成的debug apk包名为
com.example.test.debug
2》debuggable
用于配置是否生成一个可供调试的apk,值为true/false
3》jniDebuggable
用于配置是否生成一个可供调试c代码的apk,值为true/false
4》minifyEnabled
是否启用混淆
5》multiDexEnabled
是否启用自动拆分多个Dex的功能,超过65535个方法后
6》proguardFiles
配置混淆使用的配置文件
7》shrinkResources
用于配置是否自动清理未使用的资源,true/false
如果有反射引用的情况会识别不到,需要使用Keep方法来配置不被清理的资源,文件目录需在res/raw/keep.xml,例如:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@layout/img*_a">
keep.xml中还有一个属性:tools:shrinkMode配置自动清理模式,默认是safe是安全的,如果改为strict则无法识别以下代码:
getResources().getIdentifier("unused","drawable",getPackageName());
8》signingConfig 签名配置
引用signingConfigs.release/signingConfigs.debug
9》manifestPlaceholders 清单文件占位符
10》versionNameSuffix 版本名称后缀
11》zipAlignEnabled 优化apk文件,提高系统和应用的运行效率,快速读写apk中的资源,降低内存使用
- signingConfigs
配置默认的签名信息,对生成的App签名,分为debug、release版本,在buildTypes中进行引用 signingConfig signingConfigs.debug/signingConfigs.release
默认情况下Android Sdk 自动生成debug证书,名为debug.keystore key/pwd=android ,证书目录在.android/debug.keystore下
release版本需要自己配置如下信息:
storeFile =签名证书文件 格式: storeFile file("xxx/xx.jks")
storePassword = 签名证书文件的密码
keyAlias = 签名证书密钥别名
storeType = 签名证书的类型
- productFlavors 定义渠道
productFlavors{
kuan{
//定义特性
resValue "string","app_label","kuan_app"
buildConfigField "String", "SERVER_URL", "\"http://www.kuan.com\""
}
baidu{
//定义特性
resValue "string","app_label","baidu_app"
buildConfigField "String", "SERVER_URL", "\"http://www.baidu.com\""
}
}
1》 resValue
动态添加自定义资源,与在xml文件中定义是一样的,参数1 = 资源类型,参数2 = 资源id , 参数3 = value值,定义完成
会生成如下文件,引用方法 android:text = "@string/app_label" 或 getResources().getString(R.string.app_label):
定义完成后在打包时可以进行选择渠道:
2》 buildConfigField
动态添加BuildConfig中的属性
3》 manifestPlaceholders 清单文件占位符
build.gradle文件中字符映射到AndroidManifest.xml清单文件的指定位置,这里用应用程序名称来举例,把渠道类型做为应用程
序的名称
- lintOptions lint检测,检测未通过会终止构建
lintOptions{
abortOnError false 发现错误时是否终止构建
check "NewApi" 检测指定的id,多个id间用 “,”隔开
htmlOutput file("lint_check.html") 写入报告的路径,默认为构建目录下的lint_results.html
.............
}
- applicationVariants 打包命名
结合productFlavors 中的配置进行编译
3.0版本前 编译报错:
Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated
applicationVariants.all{
variant -> variant.outputs.each{
output ->
def apkName = "appName_${variant.flavorName}_${buildType.name}_v${variant.versionName}_${buildTime()}.apk"
output.outputFile = new File(output.outputFile.parent,apkName)
}
}
修改后:
defaultConfig{
...
flavorDimensions "2"
}
applicationVariants.all{
variant -> variant.outputs.all{
output ->
def apkName = "appName_${variant.flavorName}_${buildType.name}_v${variant.versionName}_${buildTime()}.apk"
outputFileName = apkName
}
}
编译成功后会在build/../output/下根据渠道名称生成相应apk文件:
如果defaultConfig中不加flavorDimensions,编译会报错( All flavors must now belong to a named flavor dimension. )
3:dependencies
gradle依赖配置,定义当前项目需要依赖的其他库
自定义task任务
闭包是Groovy的特性,指的就是一段代码块,更加灵活、轻量、可复用,“<<” 等同于doLast
- 输出内容
第一种写法:
task helloWorld{
doLast{
println "hello world"
}
或者
println "hello world"
}
第二种写法:
tasks.create("helloWorld"){
println "hello world"
}
第三种写法:
def Task ex41 = task(ex41)
ex41.doLast {
println "创建方法原型为:Task task(String name) throws InvalidUserDataException"
}
将构建的任务归类到Build tasks分类中:
def Task mTask = task exGroup
mTask.group = BasePlugin.BUILD_GROUP
mTask.description = "构建的任务归类到Build tasks中"
mTask.doLast{
println "group:${group},description:${description}"
}
通过gradlew tasks查看任务信息,可以看到该任务已归类到Build tasks分类中:
自定义成功后build文件,将会在右侧gradle的任务列表中生成一个新的任务,可以用命令或直接双击执行,两种写法都可以正常输出
运行的时候如果不加doFirst 、doLast会按顺序执行任务,如果加上会按先后顺序执行任务,起到控制输出的作用
任务的属性
1:enabled 任务的启用 / 禁用
2:onlyIf 任务的断言,是一个条件表达式
3:doFirst 任务执行前
4:doSelf 任务自身执行
5:doLast 任务执行之后
6:shouldRunAfter()
taskA.shouldRunAfter(taskB) -- taskA应该在taskB执行之后执行,这里是应该不是必须,所以可能顺序会与预设的不一样
7:mustRunAfter()
taskA.mustRunAfter(taskB) -- taskA必须在taskB执行之后执行
Gradle命令
在Android Studio中使用Terminal直接输入gradlew命令执行构建任务
1:gradlew tasks 查看所有的task
Android tasks
Build tasks
Build Setup tasks
Help tasks
Install tasks
Verification tasks
2:gradlew -q 自定义任务名称(gradlew -q hello)
3:gradlew -v 查看Gradle版本、jvm等相关信息
4:gradlew wrapper 生成wrapper所需的目录文件,根据gradle-wrapper.properties中的配置
Wrapper在win下是一个批处理脚本,使用Wrapper启动Gradle时会检查有没有下载关联Gradle,没有则会从配置的地址去下载构建
5:gradlew --refresh-dependencies assemble 强制刷新Maven依赖
6:gradlew clean hello 多任务调用,中间用空格隔开(先clean 再执行自定义的任务hello)
7:gradlew hW 通过任务名字的缩写执行 ,遵循驼峰命名法
8:gradlew assemble 编译release和debug版的apk,也可以单独指定编译版本assembleDebug/assembleRelease,生成的
release为未签名的apk,导致安装不成功;要生成带签名的release.apk,需要配置signingConfigs并在buildTypes - release中引用signingConfig signingConfigs.release
如下:
signingConfigs{
release{
storeFile file("xx/xx/xx.jks") //签名文件
storePassword "111" //签名文件密码
keyAlias "ttest" //别名
keyPassword "111" //密码
}
}
buildTypes {
release {
minifyEnabled false
debuggable true //release版本时输出日志
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release 引用签名
}
}
这样可以生成带签名的release.apk,可正常安装
9:gradlew installDebug/uninstallDebug/uninstallAll 安装debug.apk / 卸载debug.apk /卸载所有apk
10:adb install -r apk路径 替换安装release.apk
11:gradlew build 构建项目
12:gradlew check 执行lint检测
13:gradlew androidDependencies 打印Android的依赖
14:gradlew connectedCheck 安装单元测试包
15:gradlew compileDebugSources --stacktrace -info 查看栈信息