Gradle 是我们安卓者常常打交道的东西,在做一些编译期间的自动化操作时,gradle可谓非常有用武之地。了解下有哪些使用方式,也便于我们开发时候做一些编译优化。
这里小结了四个平时比较常用的gradle小技巧
一、Gradle 全局变量定义使用
gradle.ext
全局变量(可以在setting.gradle
中使用) 使用场景很多,我们可以用来外部gradle脚本中左右一些常用属性的配置,在子项目的gradle 中执行方法一键配置等。
def hello = { it ->
println "hello"
}
gradle.ext.hello = hello
//调用
gradle.ext.hello()
- 项目级的全局拓展参数可以在rootProject中设置ext。如下,在最外层的 build.gradle 中设置
ext.kotlinVersion="1.0"
///使用
rootProject.ext.kotlinVersion
二、Gradle task 任务按顺序执行
- 使用dependsOn (执行该命令前,会先执行dependsOn依赖的命令)
//执行 a4 会带上前面几个任务先执行
task a1() {
doFirst {
println "do a1";
}
}
///参数中指定 dependsOn
task a2(dependsOn: a1) {
doLast {
println "do a2"
exec {
commandLine "ls"
}
}
}
///闭包中指定 dependsOn
task a3() {
dependsOn 'a2'
doLast {
println "do a3";
}
}
///外部指定 dependsOn
task a4() {
doLast {
println "do a4";
}
}
a4.dependsOn(a3)
- 使用 finalizedBy
///a1 跑完后紧跟着就会跑 a2
task a1() {
doFirst {
println "a1"
}
}
task a2() {
doFirst {
println "a2"
}
}
a1.finalizedBy(a2)
三、Plugin 命令查看依赖树,找出重复依赖和版本号不匹配问题源头
./gradlew app:dependencies
输出的日志很直观,树形列表,有问题直接搜索对应依赖库查看版本号
\--- androidx.databinding:databinding-compiler:4.1.3
+--- androidx.databinding:databinding-compiler-common:4.1.3
| +--- androidx.databinding:databinding-common:4.1.3
| +--- com.android.databinding:baseLibrary:4.1.3
| +--- org.antlr:antlr4:4.5.3
| +--- commons-io:commons-io:2.4
| +--- com.googlecode.juniversalchardet:juniversalchardet:1.0.3
| +--- com.google.guava:guava:28.1-jre
| | +--- com.google.guava:failureaccess:1.0.1
| | +--- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
| | +--- com.google.code.findbugs:jsr305:3.0.2
| | +--- org.checkerframework:checker-qual:2.8.1
| | +--- com.google.errorprone:error_prone_annotations:2.3.2
| | +--- com.google.j2objc:j2objc-annotations:1.3
| | \--- org.codehaus.mojo:animal-sniffer-annotations:1.18
| +--- com.squareup:javapoet:1.10.0
| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.72
| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.72
| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.3.72
| | | \--- org.jetbrains:annotations:13.0
| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.72
| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.3.72 (*)
| +--- com.google.code.gson:gson:2.8.5
| +--- org.glassfish.jaxb:jaxb-runtime:2.3.1
| | +--- javax.xml.bind:jaxb-api:2.3.1
| | | \--- javax.activation:javax.activation-api:1.2.0
| | +--- org.glassfish.jaxb:txw2:2.3.1
| | +--- com.sun.istack:istack-commons-runtime:3.0.7
| | +--- org.jvnet.staxex:stax-ex:1.8
| | +--- com.sun.xml.fastinfoset:FastInfoset:1.2.15
| | \--- javax.activation:javax.activation-api:1.2.0
| +--- com.android.tools:annotations:27.1.3
| \--- com.android.tools.build.jetifier:jetifier-core:1.0.0-beta09
| +--- com.google.code.gson:gson:2.8.0 -> 2.8.5
| \--- org.jetbrains.kotlin:kotlin-stdlib:1.3.60 -> 1.3.72 (*)
+--- androidx.databinding:databinding-common:4.1.3
+--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.72 (*)
+--- com.google.auto:auto-common:0.10
| \--- com.google.guava:guava:23.5-jre -> 28.1-jre (*)
+--- commons-io:commons-io:2.4
+--- commons-codec:commons-codec:1.10
+--- org.antlr:antlr4:4.5.3
\--- com.googlecode.juniversalchardet:juniversalchardet:1.0.3
四、依赖gradle 文件
apply from:"../libconfig.gradle"
抽取通用的grdle脚本,放在一个独立的 gradle文件,在各个子 module 中 apply 该文件就行。对于多个子模块的的项目可以减少一些模板代码的使用,并且可以在修改的时候减少工作量。
libconfig.gradle
如下
apply plugin: 'com.android.library'
android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.android.buildToolsVersion
defaultConfig {
minSdkVersion rootProject.ext.android.minSdkVersion
targetSdkVersion rootProject.ext.android.targetSdkVersion
versionCode rootProject.ext.android.versionCode
versionName rootProject.ext.android.versionName
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
buildFeatures {
dataBinding = true
}
compileOptions {
sourceCompatibility = 1.8
targetCompatibility = 1.8
}
}
子项目build.gradle
就可以减少对应的配置了
apply from:"../libConfig.gradle"
dependencies {
api project(':lib_utils')
api rootProject.ext.dependencies["immersionbar"]
annotationProcessor rootProject.ext.dependencies["arouter-compiler"]
implementation rootProject.ext.dependencies["arouter-api"]
api 'androidx.appcompat:appcompat:1.3.0'
api 'com.google.android.material:material:1.3.0'
api 'androidx.constraintlayout:constraintlayout:2.0.4'
}