com.android.supportのバージョン差異をresolutionStrategyで強制的に揃える

  • Android
  • Gradle

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

依存しているライブラリごとにcom.android.support系のバージョンがバラバラで、ビルドが通らなくなった。

何が起きたか

複数のライブラリが依存しているcom.android.support系のartifact(support-v4, appcompat-v7とか)のバージョンがそれぞれ違っていて、Gradleの依存解決でコンフリクトする。マニフェストマージやAAPTのタイミングで重複クラスエラーになったりして、地味に面倒。

やったこと

build.gradleにこう書いた。

configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
details.useVersion '25.3.0'
}
}
}
}

resolutionStrategy.eachDependencyで依存解決に割り込んで、groupがcom.android.supportのものは問答無用で25.3.0に強制する。これで各ライブラリが要求してくるバージョンがバラバラでも、最終的に1つのバージョンに収束する。

multidexだけ除外している理由

requested.name.startsWith("multidex")のチェックで、multidex系のartifact(multidex, multidex-instrumentation)だけは強制対象から外している。multidex関連はcom.android.supportグループに属してはいるものの、他のサポートライブラリ本体とはバージョニングのサイクルが別になっていて、無理に25.3.0に揃えようとするとむしろ解決できなくなるケースがあったため。ここは実機で挙動を追ったわけではなく、当時の対処療法として外した、という程度の理解。

メモ

  • バージョン番号(25.3.0)は決め打ちなので、依存しているライブラリ側が新しいAPIを要求してきたら都度上げる必要がある
  • 根本対応ではなく、あくまで「ビルドを通すための強制」なので、依存関係グラフ自体は整理されていない