MoTLab -GO Inc. Engineering Blog-MoTLab -GO Inc. Engineering Blog-

Androidアプリの依存性管理をGradle Version Catalogに乗り換える

Android
June 07, 2023

タクシーアプリ『GO』のAndroidアプリを開発している山本です。 Androidアプリ開発に必要なライブラリの定義方法をGradleのVersionCatalogに乗り換えるときに調べたことと利点を紹介します。


Gradleと依存関係の定義

Androidのビルドツールとして採用されているGradleには、アプリで使用するライブラリやアプリ開発用の拡張機能などの依存関係を定義しています。

依存関係の管理は大規模なアプリになるほど複雑になります。 具体的には地図表示や通信、カメラ撮影などのアプリ機能を実現するためにライブラリや拡張機能が必要になります。 さらに複雑なアプリ機能をモジュールごとに分割して構造化すると、モジュールごとに必要な依存関係の種類やバージョンの定義が必要になります。

この複雑になりがちな依存関係を定義する方法として新しくGradleに導入されたVersionCatalogを『GO』のAndroidアプリで使用しました。

Gradle Version Catalog

動作確認環境

  • Gradle version : 7.5.1
  • Gradle script : Groovy

これまでの依存関係の定義

『GO』のAndroidアプリでは50以上のモジュールで使用する依存関係を1つのGradleファイル gradle/deps.gradle にまとめて定義していました。

Groovyの変数として定義することで、各モジュールで同じライブラリとバージョンに揃えることができます。また各モジュールから参照する場合にライブラリの種類がわかりやすいように、構造化して定義することもできます。

// gradle/deps.gradle
ext.deps = [:]
def deps = [:]

def moshi = [:]
def moshiVersion = '1.14.0'
moshi.core = "com.squareup.moshi:moshi:$moshiVersion"
moshi.adapter = "com.squareup.moshi:moshi-adapters:$moshiVersion"
moshi.kotlin = "com.squareup.moshi:moshi-kotlin:$moshiVersion"
moshi.codegen = "com.squareup.moshi:moshi-kotlin-codegen:$moshiVersion"
deps.moshi = moshi

ext.deps = deps

各モジュールでは定義済みの変数から必要な依存関係を参照します。

// feature-foo/build.gradle

// ライブラリやバージョンが定義されたGradleファイルを参照
apply from: rootProject.file('gradle/deps.gradle')

dependencies {
    implementation deps.moshi.core
    implementation deps.moshi.kotlin
    implementation deps.moshi.adapter
    kapt deps.moshi.codegen
}

VersionCatalogによる依存関係の定義

既存のGradleファイル gradle/deps.gradle をもとにVersionCatalogを定義します。Gradleのバージョン7.0から試験運用版、バージョン7.4から安定版として使用できます。

TOMLファイルにバージョン、ライブラリ、バンドル、プラグインのセクションごとに依存関係をそれぞれ定義します。ライブラリを使用するために複数まとめて定義する必要がある場合、ライブラリをまとめたバンドルとして定義することができます。 VersionCatalogの名前にはセパレータとして -, _, . が利用でき、参照する場合は . に置き換えられます。

# gradle/libs.versions.toml
[versions]
moshi-version = '1.14.0'

[libraries]
moshi-core = { module = 'com.squareup.moshi:moshi', version.ref = 'moshi-version' }
moshi-adapter = { module = 'com.squareup.moshi:moshi-adapters', version.ref = 'moshi-version' }
moshi-kotlin = { module = 'com.squareup.moshi:moshi-kotlin', version.ref = 'moshi-version' }
moshi-codegen = { module = 'com.squareup.moshi:moshi-kotlin-codegen', version.ref = 'moshi-version' }

[bundles]
moshi = [
    'moshi-core',
    'moshi-adapter',
    'moshi-kotlin',
]

モジュールごとにVersionCatalogに定義された依存関係を参照します。これまでの方法ではライブラリを個別に定義していた依存関係をバンドルを参照する1行にまとめることができます。

// feature-foo/build.gradle
dependencies {
    implementation libs.bundles.moshi
    kapt libs.moshi.codegen
}

VersionCatalogに乗り換える利点

これまでの依存関係の定義方法はあくまでGroovyの言語機能のため、良くも悪くも様々な書き方ができます。Gradleの機能として提供されるVersionCatalogを使うことで依存関係の定義方法を迷わずに済み、はじめて依存関係を確認するメンバーにもわかりやすくなります。

また複数の依存関係定義をBundleにまとめるため、モジュールが増えた場合の依存関係の抜け漏れを防ぎ、ライブラリが増減した場合の影響範囲をおさえることができます。

GitHub Dependabotを利用できる場合は、VersionCatalogに定義している依存関係をもとにアップデートがあるか確認できます。アップデート可能な依存関係を自動でリストアップできるため、依存関係を最新の状態に保ちやすくなります。

参考

Sharing dependency versions between projects | Gradle https://docs.gradle.org/current/userguide/platforms.html

Dependabot version updates keeps Gradle version catalogs up-to-date | GitHub https://github.blog/changelog/2023-03-13-dependabot-version-updates-keeps-gradle-version-catalogs-up-to-date/


We're Hiring!

📢
GO株式会社ではともに働くエンジニアを募集しています。

興味のある方は 採用ページ も見ていただけると嬉しいです。

Twitter @goinc_techtalk のフォローもよろしくお願いします!