【Android】GradleのビルドスクリプトをGroovyからKotlin DSLに移行する

【Android】GradleのビルドスクリプトをGroovyからKotlin DSLに移行する

今年もARABAKI ROCK FEST.24楽しみです、mukaiyachiです。

 

AndroidアプリのビルドツールはGradleですが、これまでGroovyという言語でbuild.gradleやsetting.gradleといったスクリプトにビルド定義を記述していました。

しかし2023年にKotlin DSLで記述するbuild.gradle.ktsやsetting.gradle.ktsがデフォルトになりました。
現在はAndroid Studioで新規にプロジェクトを作成した際に合わせて作られるのもこれらとなっています。

Kotlin DSL が新規 Gradle ビルドのデフォルトに

すぐに現在の開発に影響するわけではないですが今後のことを考慮して、少し前にとあるプロジェクトのビルドスクリプトをGroovyからKotlin DSLに移行しました。

また合わせて以下の対応も行いました。

  • gradleの依存関係とプラグインの管理をバージョンカタログに移行。(依存関係やプラグインが管理しやすくなる)
  • アノテーション処理をサポートするツールをkaptからKSPに移行。(kaptは現在メンテナンスモードとなっていて非推奨・kaptよりビルド速度が向上する可能性あり)

今回はその内容について書いていきます。

対応は概ね下記のAndroidのドキュメントページを参考に行いました。
ビルド構成を Groovy から Kotlin に移行する
ビルドをバージョン カタログに移行する
kapt から KSP に移行する

ビルドスクリプトの構文を変換

ビルド構成を Groovy から Kotlin に移行する – 構文を変換する

GroovyとKotlinの構文は異なる部分があるため、それらの違いを反映する必要があります。

以下は変換内容の例です。

メソッド呼び出しにかっこを追加

代入呼び出しに「=」を追加

・例1

・例2

文字列を変換

ファイル拡張子を変更

・変更前
/app/build.gradle
/build.gradle

・変更後
/app/build.gradle.kts
/build.gradle.kts

defをvalまたはvarで置き換える

BOOL値プロパティに接頭辞「is」を追加

リストとマップを変換

buildscriptブロックからpluginsブロックに移行 & pluginsブロックを変換

(手順1〜6)
ビルド構成を Groovy から Kotlin に移行する – buildscript から plugins ブロックに移行する
(手順7)
ビルド構成を Groovy から Kotlin に移行する – plugins ブロックを変換する

対応は下記の手順で行います。

  1. プラグインIDを確認
  2. buildscript ブロックで宣言されているプラグインのリポジトリがまだある場合、代わりに settings.gradle ファイルに移動
  3. 最上位の build.gradle ファイルの plugin ブロックにプラグインを追加
  4. 最上位の build.gradle.kts ファイルから classpath エントリを削除
  5. モジュールレベルの build.gradle ファイルの plugins ブロックにプラグインを追加して適用
  6. モジュールレベルの build.gradle ファイルからプラグインの apply plugin 呼び出しを削除
  7. plugins ブロック内をKotlinの記述方法に変換

以下はこれらの手順実施前と実施後の記述になります。

変更前の記述

モジュールレベル(app配下) build.gradleでは、元々pluginsブロックを使っていたのでその箇所に変更はありません。

変更後の記述

依存関係とプラグインの管理をバージョンカタログに移行

ビルドをバージョン カタログに移行する

バージョンカタログファイルを作成する

まずはプロジェクト直下にある gradle フォルダにlibs.versions.tomlを作成して、下記の3つのセクションを追加します。

依存関係を移行

次にモジュールレベル(app配下) build.gradle.ktsにある依存関係を、[libraries]セクションに記述します。

例)

そして、バージョンについては[versions]セクションに記述し、[libraries]セクションで version.ref = “xxxxx” という形で呼び出せるようにします。

例)

さらに libs.versions.toml で定義した名前により build.gradle.kts の依存関係を定義するようにします。

プラグインを移行

同様の方法でプラグインを移行します。
依存関係は[libraries]セクションに定義しましたが、プラグインは[plugins]セクションに定義します。
バージョンは依存関係と同じ[versions]セクションに定義します。

そして libs.versions.toml で定義した名前によりプラグインを定義するようにします。

アノテーション処理をサポートするツールをkaptからKSPに移行

kapt から KSP に移行する

kapt(Kotlin Annotation Processor Tool)はKotlinのアノテーションプロセッサで、ソースコード内のアノテーションを見つけて、それにもとづいてコードを生成する役割を持ちます。

ただ、kaptは現在メンテナンスモードになっているため、できるだけKSPに移行することが推奨されています。

KSP(Kotlin Symbol Processing)はkaptに変わるもので、ビルドのパフォーマンス向上やメモリ効率の向上、高い柔軟性や拡張性が特徴とのことです。

ほとんどの場合プロジェクトのビルド構成を変更するだけで移行できます。

変更内容は以下のような形です。
※こちらはバージョンカタログ移行後の書き方になります。
※バージョンカタログ使用していない書き方は公式ドキュメントをご覧ください。

* トップレベル build.gradle.kts

* モジュールレベル(app配下) build.gradle.kts

* libs.versions.toml

1つ注意点として、もしプロジェクトで「Data Binding」を使用している場合「ViewBinding」に移行する作業も必要になります。
「Data Binding」はKSPではサポートしておらずkaptに依存した機能とのことです。

kapt から KSP に移行する – kapt プラグインを削除する

 注: データ バインディングを使用しているモジュールでは、kapt も有効にする必要があるため、kapt を削除することはできません。

今回記事には書いていませんが、該当のプロジェクトではData Bindingを使用していたのでViewBindingへの移行も行いました。
ボリュームが大きくこの作業が一番大変だったかもしれません。
もし対応期間があまり取れないという場合はKSPへの移行は見送っても良いかもしれません。

その他

ドキュメントなどにあまり記載していないものなど。

Android アプリのプロダクトフレーバー(Product Flavors)を定義

Android アプリのパッケージングに関する設定

ビルド時に生成されたファイルやアーティファクトを削除するためのタスク

libs.versions.tomlでライブラリのバージョンを指定して定義

 

以上になります。
同じような対応を検討している方、対応中だけど困っている方がいましたら参考になれば幸いです。