对于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的选择
迁移到Gradle Kotlin
由于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通常如下所示:
代码语言:javascript复制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,保证正常使用
- 2. 迁移根目录下的build.gradle
基于Groovy的根目录下的build.gradle
代码语言:javascript复制// 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,保证正常使用
- 3. 迁移app下的build.gradle
这一部分的迁移是重点,着重解释下
将名称修改为build.gradle.kts
,并依次修改如下内容
- 3.1 修改plugins定义,参照如下
plugins {
//plugins中使用括号与双引号
id("com.android.application")
id("org.jetbrains.kotlin.android")
}
- 3.2 修改android定义中的defaultConfig
android {
//使用=号,以及双引号进行定义
defaultConfig {
applicationId = "org.myddd.app"
minSdk = 23
targetSdk = 33
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
}
- • 使用
=
号与双引号
来定义属性值
- 3.3 修改android定义中的signingConfigs定义
android {
signingConfigs {
create("release") {
storeFile = file("./lingne-android")
storePassword = "123456"
keyAlias = "LINGEN"
keyPassword = "123456"
}
}
}
- • 使用
create("release")
来定义release的signingConfigs - • 使用
=
号与双引号
来定义属性值
- 3.4 修改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')
3.5如果有flavor定义,同样需要修改
代码语言:javascript复制android {
flavorDimensions = "version"
productFlavors {
create("another") {
dimension = "version"
applicationId = "com.another.app"
versionCode = 1
}
}
}
- • 使用
create('another')
这样的方式来定义一个flavor - • 使用
=
号与双引号
来定义属性值
3.6 修改dependencies
代码语言:javascript复制
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的修改,只需要使用
括号
双引号
就可以了
建议
基本上面这些基础的就足够了,如果需要迁移其它模块或第三方模块,基本也都是这些元素.
这种方式我也尝试与体验了下,相对来说,比Grovvy在语法识别,易读性上,Kotlin版本确实优秀一些.
但是,基于以下两个原因,个人认为在Android使用Kotlin Gradle的必要性并不充分,包括:
- 1. Kotlin Gradle比Grovvy Gradle性能要差, 而Andrid本身开发就非常吃性能,大型Android项目使用Kotlin Gradle当前并不是非常好的选择
- 2. 创建Android项目时默认就是Groovy,并且Grovvy Gradle已经非常成熟,而Android开发中,又不存在频繁的修改Gradle. 使用Gradle Grovvy当前完全没有任何问题
因此,对于Android开发当前仍然建议继续使用Gradle Grovvy.