Kotlin DSL 优势
- 类型安全补全,减少笔误。
- 与 Kotlin 共享工具链,易于提取公共函数。
- 更好地支持多模块与版本管理。
基础示例
build.gradle.kts
plugins {
id("com.android.application") version "8.6.0"
kotlin("android")
}
android {
compileSdk = 34
defaultConfig {
applicationId = "com.example.app"
minSdk = 24
targetSdk = 34
versionCode = 3
versionName = "1.2.0"
}
}
Version Catalog 管理依赖
gradle/libs.versions.toml
[versions]
kotlin = "1.9.24"
androidx-core = "1.13.1"
[libraries]
androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidx-core" }
[plugins]
android-application = { id = "com.android.application", version = "8.6.0" }
settings.gradle.kts
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
dependencyResolutionManagement {
versionCatalogs {
create("libs") {
from(files("gradle/libs.versions.toml"))
}
}
}
使用:implementation(libs.androidx.core.ktx)。
构建逻辑模块化
创建 build-logic 自定义插件:
build-logic/
└── convention/
├── build.gradle.kts
└── src/main/kotlin/AndroidApplicationConventionPlugin.kt
class AndroidApplicationConventionPlugin : Plugin<Project> {
override fun apply(target: Project) = with(target) {
pluginManager.apply("com.android.application")
pluginManager.apply("org.jetbrains.kotlin.android")
extensions.configure<ApplicationExtension> {
compileSdk = 34
defaultConfig.minSdk = 24
}
}
}
模块使用:
plugins {
id("com.example.android.application")
}
构建性能优化
| 优化项 | 操作 |
|---|---|
| 配置缓存 | org.gradle.configuration-cache=true |
| Gradle 缓存 | org.gradle.caching=true |
| 并行构建 | org.gradle.parallel=true |
| Kotlin Daemon | 默认启用,确保 JDK 版本一致 |
| R8 优化 | minifyEnabled false -> Release 再开启 |
gradle.properties
org.gradle.jvmargs=-Xmx4g -Dfile.encoding=UTF-8
kotlin.incremental=true
kotlin.incremental.java=true
kapt.incremental.apt=true
任务调试
./gradlew tasks查看任务列表。./gradlew assembleDebug --scan分析构建。./gradlew lint --profile生成构建性能报告。
常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 类型不匹配 | Kotlin DSL 类型推断失败 | 显式指定类型或导入 com.android.build.api |
| 插件顺序导致异常 | 依赖插件未提前应用 | 在 Convention Plugin 中统一应用顺序 |
| 构建缓存命中率低 | 任务输入不稳定 | 确保 @Input 标记正确,避免随机路径 |
实战案例:Kotlin DSL 是”用类型安全换学习成本”
Groovy DSL 写构建脚本像写配置,Kotlin DSL 像写代码——有自动补全、有类型检查,写错 implementation 直接红。但代价是:构建脚本本身也要编译,build.gradle.kts 改一行,Gradle 要先编译脚本再执行,配置阶段变慢。
我的实战建议(来自 Flutter + 原生两边的构建经验):
- 新项目直接 Kotlin DSL,别犹豫。Google 官方模板早切了,社区插件也都跟上了。
- 用 Version Catalog(
libs.versions.toml)管版本。Flutter 侧没有对等物(pubspec.yaml 里版本号散落各处),Android 这套”一处定义、处处引用”是真香,Dependabot/Renovate 也能直接读它来提 PR。 - 构建优化别迷信参数:
org.gradle.parallel=true、org.gradle.caching=true是免费午餐先开;但configuration-cache和 KSP/kapt 混用时偶发诡异 bug,开了之后构建挂了,先试关掉它再排查。
Flutter 开发者有个独特优势:Dart 是 AOT 编译,天然快;但 Android 的 R8/dex 流程慢得多。理解 Gradle 构建,才能理解为什么 Android 包”build 一下要 3 分钟”——知识是通的。
参考:Android 官方文档《Configure your build》;Gradle 官方文档 Kotlin DSL 章节
总结
- 使用 Kotlin DSL + Version Catalog,可让依赖管理更规范。
- 构建逻辑模块化、开启缓存与并行度,是提升构建速度的关键。
- 对于大型项目,建议结合 Gradle Enterprise 或 Build Scan 定期审计构建健康度。
