はじめに
最近nowinandroidやconference-app-2022といったとってもありがたいサンプルプロジェクトが公開されたけれど、どちらもGroovyではなくktsでビルド周りを実装していたね。
公式のドキュメントを読んでみると
Kotlin の方が可読性が高く、コンパイル時のチェックと IDE サポートが優れているため、今後、Gradle スクリプトの記述には Groovy よりも KTS が優先されます。
と書いてあるので、今後はktsでビルドするのが主流になるかもしれないね。
まだktsの方がビルドが遅くなってしまうらしいけど、これからどんどん改善されてKotlinで読みやすいビルドロジックが書けるようになったらとても素敵。
ただ、いきなりnowinandroidやconference-app-2022のビルド周りのコードを読んでみてもさっぱりわからんかった。
ということで、超ミニマム構成でGroovyからktsへの移行をやってみたので、必要だったことをまとめていくよ。
やること
やったことはたったの2つ。
-
.gradle
を.gradle.kts
に書き換える。 - Groovyの記述をKotlinに直していく。
この二つ。
順に解説していくよ。
1. .gradle
を.gradle.kts
に書き換える。
これは本当にファイルの拡張子を変えるだけ。
作りたてのプロジェクトであれば、プロジェクト直下とapp直下のbuild.gradleと、settings.gradleの拡張子をktsに修正してあげよう。
2. Groovyの記述をKotlinに直していく。
これがちょっと面倒臭かった。
主に対応しなきゃいけないのは下記の3つ。
- シングルクォートからダブルクォートへの置換
- ()の追加
- =の追加
Groovyでは、関数呼び出しに()が必要ないらしいんだけど、Kotlinではそうもいかないので修正する。
同様に、Groovyでは変数への代入に=が必要ないらしいけど、Kotlinに直したいので=を追加する。
ちなみにこんな感じ。
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
android {
namespace 'com.example.groovy_kts_migration'
compileSdk 32
defaultConfig {
applicationId "com.example.groovy_kts_migration"
minSdk 21
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'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
}
android {
namespace = "com.example.groovy_kts_migration"
compileSdk = 32
defaultConfig {
applicationId = "com.example.groovy_kts_migration"
minSdk = 21
targetSdk = 32
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
}
dependencies {
implementation("androidx.core:core-ktx:1.7.0")
implementation("androidx.appcompat:appcompat:1.4.1")
implementation("com.google.android.material:material:1.5.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.3")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.3")
androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0")
}
追加で、minifyEnabled
はisMinifyEnbled
に修正しないと通らなかったので注意。
以上で完了〜。
意外と簡単だった。
まとめ
- GroovyからKTSへ移行するには、拡張子を変えてKotlinの記述に直すだけ。
- 移行自体は簡単だけど、工数に見合うメリットが現状あるのかは微妙なとこ。
- モジュールをPlugin化していったりすると、メリットが見えてくるかもしれない。
- ここでサンプル公開しているからわからなかったらみてね。コミットごとにみるとわかりやすいよ。
おわり。