—— 在Android开发中,使用Gradle Kotlin DSL会是一种什么样的体验呢?
对于Android开发来说,Gradle是必不可少的. 而对于Android来说,并不像后端Java一样,有类似Maven这样的替代选择. Gradle几乎是唯一选择
而长久以来,使用Groovy Gradle是最常见的. 但自从Android把Kotlin视为第一语言进行支持,而Gradle在Groovy之外,也很快添加了Kotlin DSL支持之后, 使用Kotin DSL来替代Groovy就成为可能.
基于对Kotlin的喜爱,以及在Java后台编码中我是使用的Gradle Kotlin而非Grovvy,所以对在Android开发中也想尝试与体验下使用Kotlin而非Grovvy.
Gradle Kotlin与Grovvy
在考虑是否需要使用Gradle Kotlin,你需要谨慎的考虑是否有必要,对于Android开发来说,迁移KTS的优势在于:
- KTS是基于Kotlin语言的, 而Kotlin现在也是Android开发的第一语言. 使用KTS意味着语言上是一致的,你能更熟悉灵活的使用Gradle
- Android已经申明未来会更偏向于优先支持KTS而非Grovvy
- 源自IDEA的Android Studio对Kotlin支持更好 (Kotlin是由IDEA背后的公司开发的语言)
缺点在于:
- 当前,Gradle KTS可能Grovvy构建要慢, 注重编译性能的可能需要对此点特别关注
- Android Studio创建Android项目时,只能生成Groovy,而没有生成KTS的选择
迁移步骤
由于Android Studio并未提供创建时是选择Grovvy还是Kotlin. 所以,现在想使用Kotlin DSL,你得在Grovvy基础之上,手动迁移.
这篇文章就是描述,如何从Grovvy迁移至KTS
而Gradle是使用Grovvy还是Kotlin DSL的唯一区别就是文件名的后缀,但凡.gradle则表明它是基于Grovvy的,而.gradle.kts则表明它是Kotlin
迁移方式
Gradle项目同时支持Grovvy以及KTS,这意味着你甚至可以有些是.gradle,有些是.gradle.kts,把它们混合起来都是允许的
所以,最佳的迁移方式是:渐进式迁移
也就是,修改完一个文件,编译通过,再修改下一个,按照这样的步骤来迁移
而对于Android Gradle来说,主要是以下一些文件需要修改与迁移
- setting.gradle
- build.gradle
- app/build.gradle 或其它子模块的build.gradle
接下来详细说明如何对这些文件进行迁移
1 .迁移setting.gradle
基于Groovy的setting.gradle通常如下所示:
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
maven {
url "https://maven.myddd.org/releases"
}
google()
mavenCentral()
}
}
rootProject.name = "My Application"
include ':app'
把它重命名为setting.gradle.kts
//pluginManagement一致,无需修改
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
//自定义maven时,url设置需要修改
maven {
setUrl("https://maven.myddd.org/releases/")
}
google()
mavenCentral()
}
}
//1. 使用括号
//2. Kotlin DSL中不能使用单引号,一律改为双引号
include(":app")
- 添加其它maven仓库时,使用
seturl("")来进行定义 - include定义时,使用
括号与双引号
迁移完这一步后,重新编译与运行APP,保证正常使用
- 迁移根目录下的build.gradle
基于Groovy的根目录下的build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id 'com.android.application' version '7.3.1' apply false
id 'com.android.library' version '7.3.1' apply false
id 'org.jetbrains.kotlin.android' version '1.7.20' apply false
}
将其重命名为build.gradle.kts,并将内容修改如下
plugins {
// 1. 使用括号与双引号
id("com.android.application") version "7.3.1" apply false
id("com.android.library") version "7.3.1" apply false
id("org.jetbrains.kotlin.android") version "1.6.10" apply false
}
//添加clean支持
tasks.register("clean", Delete::class) {
delete(rootProject.buildDir)
}
同样切记,迁移完这一步后,重新编译与运行APP,保证正常使用
- 迁移app下的build.gradle
这一部分的迁移是重点,着重解释下
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
android {
namespace 'org.myddd.myapplication'
compileSdk 32
defaultConfig {
applicationId "org.myddd.myapplication"
minSdk 23
targetSdk 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.5.1'
implementation 'com.google.android.material:material:1.7.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.4'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'
}
将名称修改为build.gradle.kts,并依次修改如下内容
- 修改plugins定义,参照如下
plugins {
//plugins中使用括号与双引号
id("com.android.application")
id("org.jetbrains.kotlin.android")
}
主要是使用括号 + 双引号进行修改
- 修改android定义中的defaultConfig
android {
//使用=号,以及双引号进行定义
defaultConfig {
applicationId = "org.myddd.app"
minSdk = 23
targetSdk = 33
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
}
修改点如下:
- 使用
=号与双引号来定义属性值
- 修改android定义中的signingConfigs定义
android {
signingConfigs {
create("release") {
storeFile = file("./lingne-android")
storePassword = "123456"
keyAlias = "LINGEN"
keyPassword = "123456"
}
}
}
- 使用
create("release")来定义release的signingConfigs - 使用
=号与双引号来定义属性值
- 修改android定义中的buildType
android {
buildTypes {
getByName("release") {
isMinifyEnabled = true
signingConfig = signingConfigs.getByName("release")
proguardFiles(
getDefaultProguardFile("proguard-android.txt"),
"proguard-rules.pro"
)
}
}
}
- 使用
getByName("release")以及getByName("debug")来定义release以及debug的buildTypes - 其它自已添加的buildTypes,要使用
create('antoherType')
- 如果有flavor定义,同样需要修改
android {
flavorDimensions += "version"
productFlavors {
create("another") {
dimension = "version"
applicationId = "com.another.app"
versionCode = 1
}
}
}
- 使用
create('another')这样的方式来定义一个flavor - 使用
=号与双引号来定义属性值
- 修改dependencies
dependencies {
implementation("androidx.core:core-ktx:1.7.0")
implementation("androidx.appcompat:appcompat:1.5.1")
implementation("com.google.android.material:material:1.7.0")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.4")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0")
}
- dependencies的修改,只需要使用
括号+双引号就可以了
建议
OK,基本上面这些基础的就足够了,如果需要迁移其它模块或第三方模块,基本也都是这些元素.
这种方式我也尝试与体验了下,相对来说,比Grovvy在语法识别,易读性上,Kotlin版本确实优秀一些.
但是,基于以下两个原因,个人认为在Android使用Kotlin Gradle的必要性并不充分,包括:
- Kotlin Gradle比Grovvy Gradle性能要差, 而Andrid本身开发就非常吃性能,大型Android项目使用Kotlin Gradle当前并不是非常好的选择
- 创建Android项目时默认就是Groovy,并且Grovvy Gradle已经非常成熟,而Android开发中,又不存在频繁的修改Gradle. 使用Gradle Grovvy当前完全没有任何问题
因此,对于Android开发当前仍然建议继续使用Gradle Grovvy但需要持续保持对Gradle Kotlin的关注