Firebase引用版本沖突解決:Android dependency 'com.google.android.gms:play-services-basement' has different...

  • 前兩天在RN項目中集成原生的firebase,之后報錯插件版本沖突,報錯信息如下:

What went wrong:
Execution failed for task ':app:preDebugBuild'.
Android dependency 'com.google.android.gms:play-services-basement' has different version for the compile (16.0.1) and runtime (16.1.0) classpath. You should manually set the same version via DependencyResolution
Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
Get more help at https://help.gradle.org

嘗試

  • 這個問題可是折磨了我大半天,按照網(wǎng)上搜索的解決方式各種嘗試

1. 方法一:

  • 在項目的build.gradle中加入
allprojects {
    subprojects {
            project.configurations.all {
                resolutionStrategy.eachDependency { details ->
                    if (details.requested.group == 'com.android.support'
                            && !details.requested.name.contains('multidex') ) {
                        details.useVersion "16.1.0"
                    }
                }
            }
        }
}

2. 方法二:

classpath 'com.google.gms:google-services:4.0.2' // Just updated the version here.

3. 方法三:

  • 各個module的dependencies里的compile改為implementation
    然而,并沒有什么卵用

解決方法

  • 之后靜下心來好好思考了下,依賴版本沖突,肯定是存在重復依賴的問題。從這個思路著手:

第一步:

第二步:

  • 去除依賴沖突 參考https://blog.csdn.net/yyo201/article/details/80570741
    在Teminal 里面輸入 gradlew app:dependencies 回車之后等一會兒就可以查看到整個項目的依賴樹結構了。

    image.png

    image.png

  • 在依賴樹結構里搜索出現(xiàn)版本沖突的module,即play-services-basement,
    上面應該可以看出來 271行到273行firebase-core引用的play-services-basement版本是16.0.1,
    432行-436行看到react-native-device-info引用的play-services-basement版本變成了16.1.0,
    才導致了play-services-basement引用版本沖突。

  • 那我們?nèi)コ貜鸵胮lay-services-basement不就可以了么。
    在引用firebase-core的moudle的build.gradle文件中exclude 掉play-services-basement,

implementation ('com.google.firebase:firebase-core:16.0.6') { // 所加的第三方框架
        exclude group: 'com.google.android.gms',module: 'play-services-basement'     // 加載時排除框架中的design包
    }
  • 現(xiàn)在編譯,就能成功通過了。

其他可行方法

版本沖突

在同一個配置下(例如androidTestCompile),某個模塊的不同版本同時被依賴時,默認使用最新版,gradle同步時不會報錯。例如下面的hamcrest-core和runner。

dependencies {
   androidTestCompile('com.android.support.test:runner:0.4')
   androidTestCompile('com.android.support.test:rules:0.2')
   androidTestCompile('com.android.support.test.espresso:espresso-core:2.1')
}
+--- com.android.support.test:runner:0.4
|    +--- com.android.support:support-annotations:23.0.1
|    +--- junit:junit:4.12
|    |    \--- org.hamcrest:hamcrest-core:1.3
|    \--- com.android.support.test:exposed-instrumentation-api-publish:0.4
+--- com.android.support.test:rules:0.2
|    \--- com.android.support.test:runner:0.2 -> 0.4 (*)
\--- com.android.support.test.espresso:espresso-core:2.1
     +--- com.android.support.test:rules:0.2 (*)
     +--- com.squareup:javawriter:2.1.1
     +--- org.hamcrest:hamcrest-integration:1.1
     |    \--- org.hamcrest:hamcrest-core:1.1 -> 1.3
     +--- com.android.support.test.espresso:espresso-idling-resource:2.1
     +--- org.hamcrest:hamcrest-library:1.1
     |    \--- org.hamcrest:hamcrest-core:1.1 -> 1.3
     +--- javax.inject:javax.inject:1
     +--- com.google.code.findbugs:jsr305:2.0.1
     +--- com.android.support.test:runner:0.2 -> 0.4 (*)
     +--- javax.annotation:javax.annotation-api:1.2
     \--- org.hamcrest:hamcrest-core:1.1 -> 1.3
1、Force

force強制設置某個模塊的版本。

 configurations.all {
       resolutionStrategy {
           force 'org.hamcrest:hamcrest-core:1.3'
       }
    }
    dependencies {
       androidTestCompile('com.android.support.test:runner:0.2')
       androidTestCompile('com.android.support.test:rules:0.2')
       androidTestCompile('com.android.support.test.espresso:espresso-core:2.1')
    }

可以看到,原本對hamcrest-core 1.1的依賴,全部變成了1.3。

+--- com.android.support.test:runner:0.2
|    +--- junit:junit-dep:4.10
|    |    \--- org.hamcrest:hamcrest-core:1.1 -> 1.3
|    +--- com.android.support.test:exposed-instrumentation-api-publish:0.2
|    \--- com.android.support:support-annotations:22.0.0
+--- com.android.support.test:rules:0.2
|    \--- com.android.support.test:runner:0.2 (*)
\--- com.android.support.test.espresso:espresso-core:2.1
     +--- com.android.support.test:rules:0.2 (*)
     +--- com.squareup:javawriter:2.1.1
     +--- org.hamcrest:hamcrest-integration:1.1
     |    \--- org.hamcrest:hamcrest-core:1.1 -> 1.3
     +--- com.android.support.test.espresso:espresso-idling-resource:2.1
     +--- org.hamcrest:hamcrest-library:1.1
     |    \--- org.hamcrest:hamcrest-core:1.1 -> 1.3
     +--- javax.inject:javax.inject:1
     +--- com.google.code.findbugs:jsr305:2.0.1
     +--- com.android.support.test:runner:0.2 (*)
     +--- javax.annotation:javax.annotation-api:1.2
     \--- org.hamcrest:hamcrest-core:1.1 -> 1.3
2、Exclude

Exclude可以設置不編譯指定的模塊

configurations {
   all*.exclude group: 'org.hamcrest', module: 'hamcrest-core'
}
dependencies {
   androidTestCompile('com.android.support.test:runner:0.2')
   androidTestCompile('com.android.support.test:rules:0.2')
   androidTestCompile('com.android.support.test.espresso:espresso-core:2.1')
}

+--- com.android.support.test:runner:0.2
|    +--- junit:junit-dep:4.10
|    +--- com.android.support.test:exposed-instrumentation-api-publish:0.2
|    \--- com.android.support:support-annotations:22.0.0
+--- com.android.support.test:rules:0.2
|    \--- com.android.support.test:runner:0.2 (*)
\--- com.android.support.test.espresso:espresso-core:2.1
     +--- com.android.support.test:rules:0.2 (*)
     +--- com.squareup:javawriter:2.1.1
     +--- org.hamcrest:hamcrest-integration:1.1
     +--- com.android.support.test.espresso:espresso-idling-resource:2.1
     +--- org.hamcrest:hamcrest-library:1.1
     +--- javax.inject:javax.inject:1
     +--- com.google.code.findbugs:jsr305:2.0.1
     +--- com.android.support.test:runner:0.2 (*)
     \--- javax.annotation:javax.annotation-api:1.2
3、單獨使用group或module參數(shù)

exclude后的參數(shù)有group和module,可以分別單獨使用,會排除所有匹配項。例如下面的腳本匹配了所有的group為’com.android.support.test’的模塊。

configurations {
   all*.exclude group: 'com.android.support.test'
}
dependencies {
   androidTestCompile('com.android.support.test:runner:0.2')
   androidTestCompile('com.android.support.test:rules:0.2')
   androidTestCompile('com.android.support.test.espresso:espresso-core:2.1')
}

  -- com.android.support.test.espresso:espresso-core:2.1
         +--- com.squareup:javawriter:2.1.1
         +--- org.hamcrest:hamcrest-integration:1.1
         |    \--- org.hamcrest:hamcrest-core:1.1
         +--- com.android.support.test.espresso:espresso-idling-resource:2.1
         +--- org.hamcrest:hamcrest-library:1.1
         |    \--- org.hamcrest:hamcrest-core:1.1
         +--- javax.inject:javax.inject:1
         +--- com.google.code.findbugs:jsr305:2.0.1
         +--- javax.annotation:javax.annotation-api:1.2
         \--- org.hamcrest:hamcrest-core:1.1

單獨給某個模塊指定exclude

dependencies {
   androidTestCompile('com.android.support.test:runner:0.2')
   androidTestCompile('com.android.support.test:rules:0.2')
   androidTestCompile('com.android.support.test.espresso:espresso-core:2.1') {
       exclude group: 'org.hamcrest'
   }
}
+--- com.android.support.test:runner:0.2
|    +--- junit:junit-dep:4.10
|    |    \--- org.hamcrest:hamcrest-core:1.1
|    +--- com.android.support.test:exposed-instrumentation-api-publish:0.2
|    \--- com.android.support:support-annotations:22.0.0
+--- com.android.support.test:rules:0.2
|    \--- com.android.support.test:runner:0.2 (*)
\--- com.android.support.test.espresso:espresso-core:2.1
     +--- com.android.support.test:rules:0.2 (*)
     +--- com.squareup:javawriter:2.1.1
     +--- com.android.support.test.espresso:espresso-idling-resource:2.1
     +--- javax.inject:javax.inject:1
     +--- com.google.code.findbugs:jsr305:2.0.1
     +--- com.android.support.test:runner:0.2 (*)
     \--- javax.annotation:javax.annotation-api:1.2

不同配置下的版本沖突
同樣的配置下的版本沖突,會自動使用最新版;而不同配置下的版本沖突,gradle同步時會直接報錯??墒褂胑xclude、force解決沖突。

例如compile 'com.android.support:appcompat-v7:23.1.1',和androidTestCompile 'com.android.support.test.espresso:espresso-core:2.1',所依賴的com.android.support:support-annotations版本不同,就會導致沖突。

dependencies {
   compile 'com.android.support:appcompat-v7:23.1.1'
   androidTestCompile('com.android.support.test:runner:0.2')
   androidTestCompile('com.android.support.test:rules:0.2')
   androidTestCompile('com.android.support.test.espresso:espresso-core:2.1')
}

gradle同步時會提示

Warning:Conflict with dependency 'com.android.support:support-annotations'. Resolved versions for app and test app differ.

執(zhí)行dependencies會提示

FAILURE: Build failed with an exception.
* What went wrong:
A problem occurred configuring project ':app'.
> Conflict with dependency 'com.android.support:support-annotations'. Resolved versions for app and test app differ.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
4、不兼容

雖然可以通過force、exclude等方式避免依賴項版本沖突,使得grade同步成功,但是并不能代表編譯時沒有問題。由于不同版本可能不完全兼容,于是會出現(xiàn)各種奇怪的報錯。已知的解決思路是更改包的版本、嘗試強制使用不同版本的依賴項,找到可兼容的依賴組合。

參考:http://www.paincker.com/gradle-dependencies

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容