携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情
什么是 Kotlin DSL?
DSL是Domain Specific Language的缩写,指的是针对特定领域优化的编程语言。遵循声明性代码格式而不是命令式代码以最小化样板代码。 Kotlin DSL 是 Kotlin 的一个语言特性,它是一个用于 Gradle 脚本的 DSL,使用易于阅读和简单的代码。
构建脚本中使用的对象、函数和属性是从 Gradle API 和应用的插件 API 导入的。
为什么要使用 Kotlin DSL?
为什么我们的项目会考虑从 Groovy DSL 更改为 Kotlin DSL。切换到 Kotlin DSL 具有以下优势:
- 在编译时检查错误
- 代码导航
- 自动完成
- 语法高亮
- 通过 IDE 支持改进的编辑环境
- 使用与源代码相同的语言
另一方面,也有缺点。
- **当构建缓存无效或干净构建时比 Groovy DSL 慢。
- 适用于 Java 8 或更高版本
- 不支持新库版本检查功能
的确经过较长时间的使用,我们发现clean的构建方式非常的缓慢,然而这一部分就是最痛苦的部分,但我们也很难忽视 Kotlin DSL 的优势,给我们带来的便捷。
如何加入Kotlin DSL大军
非常的简单,只是需要将现有的 *.gradle 文件更改为 *.gradle .kts。
build.gradle -> build.gradle.kts
plugin部分
// Groovy版本
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt'
}
// Kotlin版本
plugins {
id("com.android.application")
id ("kotlin-android")
id ("kotlin-kapt")
}
android部分
// Groovy版本
android {
compileSdkVersion 30
buildToolsVersion "30.0.2"
defaultConfig {
applicationId "com.example.kts"
minSdkVersion 22
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
buildFeatures{ dataBinding
= true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
// Kotlin版本
android {
compileSdkVersion(30)
buildToolsVersion("30.0.2")
defaultConfig {
applicationId("com.example.kts")
minSdkVersion(22)
targetSdkVersion(30)
versionCode(1)
versionName("1.0")
testInstrumentationRunner("androidx.test .runner.AndroidJUnitRunner")
}
buildTypes {
// 使用差别
getByName("release") {
minifyEnabled(false)
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
buildFeatures.dataBinding = true
compileOptions {
sourceCompatibility(JavaVersion.VERSION_1_8)
targetCompatibility(JavaVersion.VERSION_1_8)
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
}
dependencies 部分
// Groovy版本
dependencies {
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
kapt 'com.google.dagger:dagger-compiler:2.34.1'
}
// Kotlin版本
dependencies {
implementation("androidx.constraintlayout:constraintlayout:2.0.4")
testImplementation("junit:junit:4.+")
androidTestImplementation("androidx.test.ext:junit:1.1.2")
kapt("com.google.dagger:dagger-compiler:2.34.1")
}
注意:默认情况下所有字符串都用引号(“”)表示。
如何利用buildSrc进行版本控制?
buildSrc 是 Gradle 项目根目录,您可以在其中包含构建逻辑。使用 buildSrc 和 Kotlin DSL,您只需很少的配置即可编写自定义构建代码,并在整个项目中共享此逻辑。更改 buildSrc 会使整个项目的构建缓存失效,因此应避免频繁修改。
- 添加一个名为
buildSrc的module在应用项目层,一般与app同级,注意名称保持一致。 - 添加一个
build.gradle.kts添加到根目录。 - 添加两个Kotlin文件,一个是
Version.kt,用于版本管理。一个是Dependencies.kt,用于依赖管理
版本类统一管理版本
object Versions {
const val constraintlayoutVersion = "2.0.4"
}
依赖类统一管理依赖
object Dependencies {
const val constraintlayoutDependencies = "androidx.constraintlayout:constraintlayout:${Versions.constraintlayoutVersion}"
}
应用于模块层级build.gradle.kt
dependencies {
implementation(Dependencies.constraintlayoutDependencies)
}