LoginSignup
10
2

More than 3 years have passed since last update.

flutterでプラグインのAndroidのサポートライブラリが競合した場合の対応

Last updated at Posted at 2018-10-15

ImagePickerのバージョンを上げたところ以下のエラーを出力してビルドに失敗するようになってしまいました。

* What went wrong:
Execution failed for task ':app:preDebugBuild'.
> Android dependency 'com.android.support:support-v4' has different version for the compile (26.1.0) and runtime (27.1.1) classpath. You should manually set the same version via DependencyResolution

とりあえず依存関係覗いてみようとしたけど以下のコマンド実行しけど見れず、

cd android
cd ./gradlew dependencies

正しいコマンドは次のようなものでした。

cd android
./gradlew app:dependencies

で結果の依存関係のうち問題の有りそうなのはこの部分ぽい

コンパイル時
debugCompileClasspath - Resolved configuration for compilation for variant: debug
+--- com.google.firebase:firebase-core:16.0.4
|    +--- com.google.firebase:firebase-analytics:16.0.4
|    |    +--- com.google.android.gms:play-services-basement:16.0.1
|    |    |    \--- com.android.support:support-v4:26.1.0
略...
+--- project :image_picker

実行時
debugRuntimeClasspath - Resolved configuration for runtime for variant: debug
+--- com.google.firebase:firebase-core:16.0.4
|    +--- com.google.firebase:firebase-analytics:16.0.4
|    |    +--- com.google.android.gms:play-services-basement:16.0.1
|    |    |    \--- com.android.support:support-v4:26.1.0 -> 27.1.1
略...
+--- project :image_picker
|    \--- com.android.support:support-v4:27.1.1 (*)

コンパイル時は26.1.0が使われるけど、実行時は27.1.1が使われるよって言われたけど、確かにそんな感じぽい。
でどうしよう?

firebase-coreのコンパイルを27.1.1にするか、image_pickerの実行時を26.1.1にするかの2択っぽい。
firebase-coreに依存しているライブラリが他にもあったので、今回はimage_pickerの依存するサポートライブラリを26.1.0にすることにした。

しかし、自分のbuild.gradleでなくプラグイン内のbuild.gradleを編集しなければならず、その場はいいがライブラリの更新やCIに乗せるときにどうするか考える必要があるなぁ。

とりあえず今回はimage pickerのプラグインのbuild.gradleを次のように修正して一旦解決。

dependencies {
    implementation('com.android.support:support-v4:26.1.0')
}

より良い解決方法を質問中。
https://stackoverflow.com/questions/52808690/how-can-i-resolve-conflicting-support-library-version

2018/10/16 追記

android/build.gradleに以下を追記すれば良いという回避方法をStackoverflowの回答でもらった。
試してみるとこれでうまく行った。 なるほど、subprojectsなる指定方法があるんですね。

subprojects {
    project.configurations.all {
        resolutionStrategy.eachDependency { details ->
            if (details.requested.group == 'com.android.support'
                    && !details.requested.name.contains('multidex') ) {
                details.useVersion "26.1.0"
            }
        }
    }
}

2019/06/11 追記

force を使ってより完結に記述できることがわかった

subprojects {
    project.configurations.all {
        configurations.all {
            resolutionStrategy.force 'com.google.errorprone:error_prone_annotations:2.3.1'
        }
    }
}
10
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
2