对于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,你需要谨慎的考虑是否有必要,对于Android开发来说,迁移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来说,主要是以下一些文件需要修改与迁移
接下来详细说明如何对这些文件进行迁移
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")
seturl("")
来进行定义括号
与双引号
迁移完这一步后,重新编译与运行APP,保证正常使用
基于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,保证正常使用
这一部分的迁移是重点,着重解释下
将名称修改为build.gradle.kts
,并依次修改如下内容
plugins {
//plugins中使用括号与双引号
id("com.android.application")
id("org.jetbrains.kotlin.android")
}
android {
//使用=号,以及双引号进行定义
defaultConfig {
applicationId = "org.myddd.app"
minSdk = 23
targetSdk = 33
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
}
=
号与双引号
来定义属性值
android {
signingConfigs {
create("release") {
storeFile = file("./lingne-android")
storePassword = "123456"
keyAlias = "LINGEN"
keyPassword = "123456"
}
}
}
create("release")
来定义release的signingConfigs=
号与双引号
来定义属性值
android {
buildTypes {
getByName("release") {
isMinifyEnabled = true
signingConfig = signingConfigs.getByName("release")
proguardFiles(
getDefaultProguardFile("proguard-android.txt"),
"proguard-rules.pro"
)
}
}
}
getByName("release")
以及getByName("debug")
来定义release以及debug的buildTypescreate('antoherType')
3.5如果有flavor定义,同样需要修改
android {
flavorDimensions += "version"
productFlavors {
create("another") {
dimension = "version"
applicationId = "com.another.app"
versionCode = 1
}
}
}
create('another')
这样的方式来定义一个flavor=
号与双引号
来定义属性值
3.6 修改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")
}
括号
+ 双引号
就可以了基本上面这些基础的就足够了,如果需要迁移其它模块或第三方模块,基本也都是这些元素.
这种方式我也尝试与体验了下,相对来说,比Grovvy在语法识别,易读性上,Kotlin版本确实优秀一些.
但是,基于以下两个原因,个人认为在Android使用Kotlin Gradle的必要性并不充分,包括:
因此,对于Android开发当前仍然建议继续使用Gradle Grovvy.