返回
Gradle 实用技巧和窍门:提升开发效率!
Android
2023-05-08 10:27:37
掌握 Gradle 诀窍,提升 Android 开发效率
定制化构建任务
- 自定义构建任务: 为构建任务赋予自定义名称,让脚本更易读。利用
doLast
和doFirst
任务灵活控制执行顺序。
task cleanBuild(type: Delete) {
delete buildDir
}
- 插件化构建脚本: 将构建脚本分解成独立的插件,提高可维护性和复用性。使用
includeBuild
和buildSrc
方便地管理插件。
includeBuild "../my-gradle-plugin"
- 构建缓存: 启用 Gradle 构建缓存,显著提升构建速度。通过
gradle.properties
优化缓存设置。
buildCache {
local {
enabled = true
}
}
优化依赖管理
- 依赖冲突管理: 使用
configurations
和resolutionStrategy
解决依赖冲突。通过implementation
和api
明确依赖范围。
configurations {
implementation.resolutionStrategy {
force 'com.google.guava:guava:29.0-jre'
}
}
- 依赖版本管理: 使用统一的版本号,确保项目依赖版本一致。利用
versions.txt
文件集中管理依赖版本。
ext {
kotlinVersion = '1.6.10'
}
- 离线模式管理依赖: 通过
offline
模式本地缓存依赖,即使无网络也能构建项目。
offline { enabled = true }
代码质量与测试
- 代码质量检查: 集成代码质量检查插件(如
lint
和detekt
)发现并修复代码问题,提升代码质量。
apply plugin: 'com.android.lint'
lint {
abortOnError = true
checkAllWarnings = true
}
- 单元测试增强: 自定义单元测试任务,支持并行测试和覆盖率分析。使用
junitPlatform
和jacoco
增强测试功能。
test {
useJUnitPlatform()
jacoco {
version = '0.8.7'
}
}
- 集成测试优化: 通过
androidTest
和connectedCheck
任务进行集成测试。利用Espresso
和Robolectric
提升集成测试效率。
androidTest {
applicationVariants.all { variant ->
instrumentation {
testTask.useJUnitPlatform()
testTask.jacoco {
version = '0.8.7'
}
}
}
}
构建过程中的小技巧
- 自定义构建输出: 使用
logger
和println
控制构建过程中的日志输出。通过project.buildDir
获取构建输出目录路径。
logger.lifecycle "Building project..."
println "Build output directory: ${project.buildDir}"
- 变量和属性的使用: 利用 Gradle 的变量和属性提升构建脚本的可读性和可维护性。结合
project.ext
和gradle.properties
自定义项目属性。
ext.appName = 'MyAwesomeApp'
gradle.properties.put('signingKeyId', '12345')
- Gradle 命令行技巧: 熟练使用
gradlew
命令快速执行构建任务。利用gradlew --help
了解命令行选项。
gradlew build
gradlew --help
常见问题解答
1. 如何禁用构建缓存?
答:在 gradle.properties
中设置 buildCache.local.enabled=false
。
2. 如何解决 NoClassDefFoundError
异常?
答:可能是由于依赖冲突。使用 resolutionStrategy
配置强制使用特定依赖版本。
3. 如何在集成测试中使用 Espresso?
答:添加 androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
依赖,并使用 Espresso API 编写集成测试。
4. 如何获取当前构建变体的名称?
答:使用 project.buildDir.toString().split('/').last()
。
5. 如何自定义任务名称?
答:使用 taskName 'customTaskName'
在构建任务定义之前设置任务名称。