背景
在实际的Gradle项目开发中,我们总是会遇到一些需求,要在release编译的时候执行一些任务,但debug时不需要。然而,Gradle编译有自己的一套生命周期,比如Android项目的assembleRelease任务在编译启动之前是没有办法静态获取到的。
下面我们就以“去除release版本中的logcat日志打印”为例,做一个简单的梳理。
源码
修改模板(module)级别的 build.gradle.kts
文件,我们初步目标是在编译刚启动但还没实际开始执行任务时插入我们的自定义任务,切入点就是Gradle的preBuild任务,这个是预定义的,所以可以进行静态配置:
plugins {
id("com.android.application")
id("kotlin-android")
id("kotlin-kapt")
}
android {
namespace = "com.xxx.yyy"
compileSdk = 34
// ...
}
dependencies {
// ...
}
// 重点部分
tasks {
preBuild {
// 编译启动后,相关任务会动态生成,于是可以获取到
val isAssembleRelease = gradle.startParameter.taskNames.any {
it.contains("assembleRelease")
}
if (isAssembleRelease) {
// 做一些release编译才做的事
}
}
}
以上可以说就是一个基础模板代码。此外,我们还可以添加本地配置来控制编译任务的开关,在项目(project)级别目录下添加 local.properties
文件,注意这个文件不要添加到git索引中,只是一个本地文件,一般来说项目拉取到本地的时候IDE(如Android Studio)会自动生成此文件:
## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Wed Oct 25 11:29:50 CST 2023
sdk.dir=/Users/xxx/