Androidアプリを開発していて「なぜかビルドが通らない」「依存関係のバージョン衝突で困っている」という経験、ありますよね。build.gradleに記述したライブラリが実は裏で別のライブラリを引っ張ってきていて、それが原因でエラーになることって意外と多いんです。ありますよね?ないですか?ありますよね?
こういうとき「一体どのライブラリがどのライブラリに依存しているんだ?」がわからず苦労したことがあります。そんな時はGradleのdependenciesコマンドで解決できます。
この記事ではAndroidプロジェクトで使用しているライブラリの依存関係を簡単に可視化する方法を解説します。
依存関係を調べるGradleコマンド
Androidのプロジェクトでライブラリがどのような依存関係を持っているかを調べるには、Gradleのdependenciesタスクを使用します。
実行するコマンド
Android Studioでターミナル(Terminalツールウィンドウ)を開くかコマンドラインでプロジェクトのルートディレクトリに移動してください。Android StudioでTerminalを開けば自動的にプロジェクトディレクトリがカレントディレクトリになるので便利です。:appの部分は対象モジュールに合わせて変更してください。
以下のコマンドを実行します。
macOS / Linuxの場合
./gradlew :app:dependencies --configuration releaseRuntimeClasspath
Windowsの場合
gradlew.bat :app:dependencies --configuration releaseRuntimeClasspath
–configurationにはBuild Variant(Build Type + Product Flavor)に応じた設定名を指定します。
- releaseビルドの場合: releaseRuntimeClasspath
- debugビルドの場合: debugRuntimeClasspath
- Product Flavorがdevでdebugの場合: devDebugRuntimeClasspath
コマンド実行結果の見方
コマンドを実行すると、以下のような依存関係のツリーが表示されます。
releaseRuntimeClasspath - Resolved configuration for runtime for variant: release
+--- com.android.support:support-v4:24.2.0
| +--- com.android.support:support-compat:24.2.0
| | \--- com.android.support:support-annotations:24.2.0
| +--- com.android.support:support-core-utils:24.2.0
| | \--- com.android.support:support-compat:24.2.0 (*)
| +--- com.android.support:support-media-compat:24.2.0
| | \--- com.android.support:support-compat:24.2.0 (*)
| +--- com.android.support:support-core-ui:24.2.0
| | \--- com.android.support:support-compat:24.2.0 (*)
| \--- com.android.support:support-fragment:24.2.0
| +--- com.android.support:support-compat:24.2.0 (*)
| +--- com.android.support:support-core-utils:24.2.0 (*)
| +--- com.android.support:support-media-compat:24.2.0 (*)
| \--- com.android.support:support-core-ui:24.2.0 (*)
+--- com.google.code.gson:gson:2.2.4
+--- com.android.support:multidex:1.0.1 -> 1.0.2
+--- com.journeyapps:zxing-android-embedded:3.3.0
| +--- com.google.zxing:core:3.2.1
| \--- com.android.support:support-v4:23.1.0 -> 24.2.0 (*)
+--- com.google.firebase:firebase-messaging:9.6.1
| +--- com.google.android.gms:play-services-basement:9.6.1
| | \--- com.android.support:support-v4:24.0.0 -> 24.2.0 (*)
| +--- com.google.firebase:firebase-iid:9.6.1
| | +--- com.google.android.gms:play-services-basement:9.6.1 (*)
| | \--- com.google.firebase:firebase-common:9.6.1
| | +--- com.google.android.gms:play-services-basement:9.6.1 (*)
| | \--- com.google.android.gms:play-services-tasks:9.6.1
| | \--- com.google.android.gms:play-services-basement:9.6.1 (*)
| \--- com.google.firebase:firebase-common:9.6.1 (*)
+--- com.google.android.gms:play-services-appindexing:9.6.1
| +--- com.google.android.gms:play-services-base:9.6.1
| | +--- com.google.android.gms:play-services-basement:9.6.1 (*)
| | \--- com.google.android.gms:play-services-tasks:9.6.1 (*)
| +--- com.google.android.gms:play-services-basement:9.6.1 (*)
| +--- com.google.firebase:firebase-common:9.6.1 (*)
| \--- com.google.android.gms:play-services-tasks:9.6.1 (*)
\--- com.android.support:multidex:1.0.2
(*) - dependencies omitted (listed previously)
見方のポイント
- インデントなしで+—または\—がついている行:
build.gradleにimplementationやapiで直接指定したライブラリです。 - インデントされている行:
上位ライブラリが依存している(transitive dependency)ライブラリです。プロジェクトで直接指定していないけれど自動的に取り込まれているものです。 - ->記号:
バージョンが自動的に解決・変更されたことを示します。例えば1.0.1 -> 1.0.2は、1.0.1を指定したけれど、最終的に1.0.2が採用されたことを意味します。 - (*)マーク:
すでに表示済みの依存関係が省略されていることを示します。
FAQ
- Qコマンドを実行しても何も表示されない・・・
- A
–configurationで指定したビルドバリアント名が間違っている可能性があります。プロジェクトのbuild.gradleに定義されているビルドタイプとフレーバーを確認して、正しい組み合わせを指定してください。
- Qバージョン衝突が起きているかどうかを確認したい
- A
出力結果の中で->が表示されているライブラリはバージョンが自動解決されています。このとき複数のライブラリが異なるバージョンを要求している場合、Gradleは基本的に最も高いバージョンを採用します。
もし特定のバージョンに固定したい場合はbuild.gradleで明示的にバージョンを指定するか、resolutionStrategyを使ってバージョンを強制することもできます。
- QAndroid Studio上でGUIで確認する方法はない?
- A
Android Studioには依存関係をグラフィカルに表示する機能もあります。プロジェクトウィンドウでbuild.gradleファイルを開き、右側に表示される「Dependencies」タブを確認してみてください。ただし、コマンドラインのほうが詳細な情報が得られることもあります。
まとめ
Androidプロジェクトでライブラリの依存関係を調べたいときはGradleのdependenciesコマンドが便利です。ポイントをまとめておきますね。
- macOSなら
./gradlew :app:dependencies –configuration releaseRuntimeClasspath - Windowsなら
gradlew.bat :app:dependencies –configuration releaseRuntimeClasspath - –configurationにはビルドバリアントに応じた設定名(例: debugRuntimeClasspath)を指定する
- 出力結果を見れば、どのライブラリがどのライブラリに依存しているかが一目瞭然
- バージョン衝突やビルドエラーの原因究明に役立つ
ビルドが通らないときや「なんでこのライブラリが入ってるの?」と疑問に思ったときに、ぜひ試してみてくださいね。
Googleの公式ドキュメントも参考にどうそ。
Gradle 依存関係の解決 | Android Studio | Android Developers


