Kotlin DSL
Android Studio 默认的模板已推荐使用 Kotlin DSL 取代 Groovy DSL 作为构建脚本。Kotlin DSL 已成为 AGP 8.0+ 文档优先,Groovy DSL 仍受支持但新特性适配滞后。Kotlin DSL 不是“另一种写法”,而是构建脚本工程化的基础设施升级。
Kotlin DSL 脚本相对于Groovy DSL 脚本最大的优势是良好的代码提示。kotlin-dsl 对 groovy -dsl的语法转变,基本上是把单引号改成双引号,然后加上括号或者加上等于号。
在Groovy DSL中也可以使用双引号+字符串模板。
基础配置差异
- 文件名称增加.kts
build.gradle文件名称变为build.gradle.kts
- 方法调用变为赋值语句
namespace 'com.example.app' // Groovy 中为方法调用
namespace = "com.example.app" // Kotlin 中为赋值语句
- 布尔属性增加 is 前缀
minifyEnabled false // 无 is 前缀
isMinifyEnabled = false // 布尔属性带 is 前缀!
| 区别 | Groovy 写法 | Kotlin 写法 | 原因 |
|---|---|---|---|
| 布尔属性 | minifyEnabled false | isMinifyEnabled = false | Kotlin Bean 属性规范 |
| 字符串拼接 | "lib-$version" | "lib-$version"(需双引号) | Kotlin 字符串模板要求 |
| 访问 ext 属性 | ext.libVersion = "1.0" | extra["libVersion"] = "1.0" | Kotlin 无动态 ext |
| 集合追加 | include << ":module" | include(":module") | Kotlin 无 << 操作符 |
| 插件版本 | id 'plugin' | id("plugin") version "x.y.z" | Kotlin DSL 要求显式版本(根项目) |
依赖管理革命
Version Catalog + 类型安全访问器。
先独立配置依赖版本
在gradle/libs.versions.toml中配置依赖版本:
[versions] kotlin = "1.9.20" androidx-core = "1.12.0" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "androidx-core" } kotlin-stdlib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib", version.ref = "kotlin" }再使用依赖
在build.gradle.kts中使用依赖:
dependencies { //依赖libs.versions.toml中配置的库版本 implementation(libs.androidx.core.ktx) // ✅ 编译时检查,IDE 智能提示 implementation(libs.kotlin.stdlib) //直接硬编码依赖库版本 //字符串模板安全使用 val retrofitVersion = "2.9.0" implementation("com.squareup.retrofit2:retrofit:$retrofitVersion") }Kotlin 语言特性赋能
// 扩展函数封装公共逻辑(放入 buildSrc 或 convention plugin) fun Project.configureAndroidLint() { tasks.withType<LintTask>().configureEach { lintConfig = file("lint.xml") isCheckDependencies = true } } // 作用域函数简化配置 android.buildFeatures.apply { viewBinding = true compose = true } // 安全访问 project 属性 val debugMode = extra["debugMode"] as? Boolean ?: falselibs.versions.toml
libs.versions.toml文件的使用:https://blog.csdn.net/android_cai_niao/article/details/160431318
[libraries]的写法
# 写法一:拆分 group + name(更清晰) androidx-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "androidx-ktx" } # 写法二:合并简写 module(更简洁) androidx-ktx = { module = "androidx.core:core-ktx", version.ref = "androidx-ktx" } # 写法三:内联版本号(不推荐,版本分散) androidx-ktx = { module = "androidx.core:core-ktx", version = "1.12.0" }[bundles]
bundle作用是把依赖打包
[bundles] hilt = ["hilt-android", "hilt-compiler"]别名归化
所有依赖的别名(alias)都会被 Gradle 标准化处理:凡是别名中含有 -、_ 或 . 的,引用时都统一转换为 .,原因是Gradle 用点号 . 来生成层级访问器(type-safe accessor),如果允许别名里直接写 .,会产生歧义,所以统一把 - 和 _ 都归一化为 .,然后在前面加上libs.*前缀。
| 引用版本值 | libs.versions.<alias>.get() |
| 引用库依赖 | libs.<alias> |
| 引用插件 | libs.plugins.<alias> |
| 引用bundle | libs.bundls.<alias> |
推荐的命名规范是使用 kebab-case(如 androidx-ktx),这样可以在构建文件中获得更好的代码补全支持。
kebab-case命名风格
Kebab-case命名风格,单词之间用连字符-连接,所有字母小写。就像串在烤串上的肉块 🍢,所以叫 “kebab”(烤串)
常见命名风格
| kebab-case | 短横线连接 | androidx-ktx、my-library |
| camelCase | 首单词小写,后续首字母大写 | androidxKtx、myLibrary |
| PascalCase | 每个单词首字母大写 | AndroidxKtx、MyLibrary |
| snake_case | 下划线连接 | androidx_ktx、my_library |
| SCREAMING_SNAKE_CASE | 下划线+全大写 | ANDROIDX_KTX、MY_LIBRARY |
各场景的惯用风格
- kebab-case → HTML/CSS 类名、libs.versions.toml 的别名、URL
- camelCase → Java/Kotlin 变量名、函数名
- PascalCase → Java/Kotlin 类名
- snake_case → Python 变量名、数据库字段名
libs.versions.toml 推荐 kebab-case,是因为 - 会被 Gradle 自动转成 .,天然形成层级结构,代码补全体验更好。
apply plugin: 'kotlin-android-extensions'
- Kotlin Android Extensions 是 JetBrains 为简化 Android 开发而提供的插件,允许开发者通过 XML 布局中的
id直接访问 View,例如btn_login.setOnClickListener { ... },无需调用findViewById()。 - 该插件自 Kotlin 1.2 引入,在早期广泛用于减少样板代码,现已废弃。
废弃时间线
- 2020 年起:Google 官方逐步明确不再推荐使用 Kotlin Android Extensions。
- Kotlin 1.8.0(2021 年底):正式禁用该插件。
- 当前(2026 年):该插件已完全废弃,新项目不应使用。