KC Blog

Androidプロジェクトを.tomlに移行する際に直面する問題

7 min read
AndroidDev#Kotlin
前書き
* 以前のプロジェクトを`.kts`に変更してビルドするようになってから

公式もプロジェクトをversion catalogsバージョンディレクトリに移行することを目的とした記事を公開しました

追加すると、Android StudioでAndroidをディレクトリとして表示する際に下部に表示されます

これで一手間省けます(ダブルShiftで検索する必要がなくなりますXD)

クリックするだけで内容が見られます

  • 以前はDependence.ktのようなものを作成すると、ダブルShiftで検索するか

../Dependence.ktで探す必要がありました

適用されるAGPバージョン
  • 新しいバージョンのAndroid Studioでは

IDEの新しいプロジェクトを通じて直接設定できますが

古いプロジェクトに遭遇した場合

手動で移行する際にAGPバージョンを更新する必要があるかどうかが気になります

通常、古いプロジェクトは長い年月が経っている可能性があり

更新に時間がかかるか、短期間で最適化するコストがない場合

元のバージョンを維持することを考慮することがあります

  • そこで少し調べてみました

手元のASで作成したAGPでtomlが設定されているものを適当に選びました

バージョンは8.4.0でした

  • Gradle公式ドキュメントを調べたところ、7.0のドキュメントで 7.0のリリースでversion catalogsの実験的機能がサポートされたと記載されています

Gradle 7.0 リリースノート つまり、tomlは7.xで使用できるということです

移行時に直面する可能性のある問題
* プロジェクトでこのような方法でライブラリを導入している場合があります
implement("com.orhanobut:dialogplus:1.11@aar")

後ろに@aarが付いていますが

tomlのversionsでは後ろに@aarを追加することがサポートされていないため

ビルドが通りません

以下のように変更すれば問題ありません

  • 過去にはkotlinオブジェクトを使用してバージョンパラメータを設定していました、以下のように

すべてを.tomlに変更したい場合 外部から.tomlで設定されたバージョンにアクセスする実験を行いましたが

libsのように直接使用することはできません

libs.xx.xx.xxxでバージョンを取得することはできません

直接get()を使用して.toml内のVersionsの値を取得する必要があります

例:libs.versions.minSdk.get().toInt()

ただし、この方法で設定すると

.toml内でどこで使用されているかが見えません

aapt dump badging appName.apkを使用してビルドされたものとlibs.versions.minSdk.get()で設定されたものが一致するかを検証します

  • AGP 8.1.0未満の設定では、plugin{}の上に@Suppress("DSL_SCOPE_VIOLATION")を追加する必要があります。

これはIDE側の問題によるものです。 IDEのKotlinスクリプトエディタでプラグインエイリアスのバージョンカタログアクセサがエラーとして表示される #22797

  • 次に、[plugins]の下のversion.refについて

nullまたは空に設定することはできません。

一部のプロジェクトでは、plugin + classpathを使用して設定を行います。

これにより、直接plugins設定を使用すると競合が発生します。

なぜ一部のライブラリはversion.refを設定しなくてもビルドできるのか
* 初めて`.toml`を使用する際、一部のライブラリにversion.refを設定しなくても

正常にビルドできることに気づくでしょう。

これは、composeBomを導入した際に

他の関連ライブラリをバージョン設定なしで導入すると

設定したcomposeBomのバージョンに基づいて

関連ライブラリのバージョンが自動的にマッピングされるためです。

このように、composeBomを設定するだけで、自動導入をサポートする部分が互換性のあるバージョンに設定されます。

非常に便利です!

バージョンカタログの移行方法

移行説明

../gradleディレクトリの下にlib.version.tomlを作成します。

必要に応じて[versions][libraries][plugins]を追加します。

公式が推奨する命名方式はケバブケースです。

これによりコード補完がより良くなります。

以下のコード例を参照してください:

実際の使用例

tomlを追加した後、sync nowを押して同期します。

その後、build.gradle.ktsで直接使用できます。

以下のコード例を参照してください:

参考資料
- Android developer公式ドキュメント