Androidプロジェクトを.tomlに移行する際に直面する問題
-
以前のプロジェクトを
.kts
に変更してビルドするようになってから
公式もプロジェクトをversion catalogsバージョンディレクトリに移行することを目的とした記事を公開しました
追加すると、Android StudioでAndroidをディレクトリとして表示する際に下部に表示されます
これで一手間省けます(ダブルShiftで検索する必要がなくなりますXD)
クリックするだけで内容が見られます -
以前はDependence.ktのようなものを作成すると、ダブルShiftで検索するか
../Dependence.kt
で探す必要がありました
-
新しいバージョンの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設定を使用すると競合が発生します。
- 初めて
.toml
を使用する際、一部のライブラリにversion.refを設定しなくても
正常にビルドできることに気づくでしょう。
これは、composeBom
を導入した際に
他の関連ライブラリをバージョン設定なしで導入すると
設定したcomposeBomのバージョンに基づいて
関連ライブラリのバージョンが自動的にマッピングされるためです。
このように、composeBomを設定するだけで、自動導入をサポートする部分が互換性のあるバージョンに設定されます。
非常に便利です! - Bomマッピングを参照して対応するバージョンを確認
移行説明
../gradleディレクトリの下にlib.version.tomlを作成します。必要に応じて[versions]、[libraries]、[plugins]を追加します。
公式が推奨する命名方式はケバブケースです。
これによりコード補完がより良くなります。
以下のコード例を参照してください:
実際の使用例
tomlを追加した後、sync nowを押して同期します。その後、build.gradle.ktsで直接使用できます。
以下のコード例を参照してください: