将 firebase 库更新到 16.0.0 会引发 google play services 依赖问题

Posted

技术标签:

【中文标题】将 firebase 库更新到 16.0.0 会引发 google play services 依赖问题【英文标题】:Updating firebase library to 16.0.0 raises google play services dependency issue 【发布时间】:2018-11-03 23:40:29 【问题描述】:

我的项目一直运行良好,直到有一天,无缘无故(我没有改变任何东西),gradle 开始出现这个奇怪的错误:

Program type already present: com.google.android.gms.internal.measurement.zzabo

在出现此错误时,我的项目级 gradle 是这样的:

buildscript 
    repositories 
        jcenter()
        maven 
            url 'https://maven.google.com'
            // Alternative URL is 'https://dl.google.com/dl/android/maven2/'
        
        maven  url 'https://plugins.gradle.org/m2/'
        maven  url 'https://maven.fabric.io/public' 
    
    dependencies 
        classpath 'com.android.tools.build:gradle:3.1.2'
        classpath 'com.google.gms:google-services:4.0.0'
        classpath 'io.fabric.tools:gradle:1.25.3'
        classpath 'gradle.plugin.com.onesignal:onesignal-gradle-plugin:0.8.1'
    


allprojects 
    repositories 
        jcenter()
        maven 
            url 'https://dl.bintray.com/sayyam/maven'
        
        maven 
            url "https://jitpack.io"
        
        maven 
            url 'https://maven.google.com'
        
    


task clean(type: Delete) 
    delete rootProject.buildDir

这是我的应用级 gradle:

apply plugin: 'com.android.application'
apply plugin: 'com.onesignal.androidsdk.onesignal-gradle-plugin'
apply plugin: 'io.fabric'

android 
    compileSdkVersion 27
    buildToolsVersion "27.0.3"

    dexOptions 
        javaMaxHeapSize "4g"
    
    packagingOptions 
        exclude 'META-INF/rxjava.properties'
    
    defaultConfig 
        applicationId "com.example"
        deviceCheck
        minSdkVersion 17
        targetSdkVersion 27
        versionCode 8
        versionName "1.0"
        vectorDrawables.useSupportLibrary = true
        multiDexEnabled true
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    


dependencies 
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.google.firebase:firebase-invites:15.0.1'
    implementation 'com.google.firebase:firebase-core:15.0.2'
    implementation 'com.crashlytics.sdk.android:crashlytics:2.9.2'
    implementation 'com.google.android.gms:play-services-maps:15.0.1'
    implementation 'com.google.android.gms:play-services-location:15.0.1'
    implementation 'com.google.android.gms:play-services-places:15.0.1'
    implementation 'com.google.maps.android:android-maps-utils:0.5'
    implementation 'com.android.support:support-v13:27.1.1'
    implementation 'com.android.support:support-v4:27.1.1'
    implementation 'com.android.support:appcompat-v7:27.1.1'
    .....other dependencies.....
    testImplementation 'junit:junit:4.12'

apply plugin: 'com.google.gms.google-services'

我在 *** 上搜索并找到了 this 答案。这表示此问题可能与 firebase 依赖版本和 google-services 插件有关。所以我将google-services 插件版本更新为4.0.0,并将firebase 更新为最新版本16.0.0。正如人们对 gradle 所期望的那样,它给出了另一个似乎与 firebase 版本 16.0.0 相关的错误。

每当我将 firebase 版本更改为 16.0.0 时,显然它也会尝试自动将 google play 服务依赖项升级到 16.0.0。这甚至不存在!它引发以下 gradle 错误:

Failed to resolve: com.google.android.gms:play-services-maps:16.0.0
Failed to resolve: com.google.android.gms:play-services-location:16.0.0 
Failed to resolve: com.google.android.gms:play-services-places:16.0.0   
Failed to resolve: com.google.android.gms:play-services-gcm:16.0.0  
Failed to resolve: com.google.android.gms:play-services-base:16.0.0 
Failed to resolve: com.google.android.gms:play-services-basement:16.0.0 
Failed to resolve: com.google.android.gms:play-services-measurement-base:16.0.0 
Failed to resolve: com.google.android.gms:play-services-tasks:16.0.0    
Failed to resolve: com.google.android.gms:play-services-stats:16.0.0
Failed to resolve: com.google.android.gms:play-services-ads-identifier:16.0.0

我尝试使用 resolutionStrategy 强制 gms 库的版本,但无济于事。我该怎么办?我做错了什么?

注意:我没有明确更改播放服务库版本,gradle 似乎是因为 firebase 才这样做的。

编辑: 这个问题可以通过this 问题中给出的解决方案来解决,但它仍然不是重复的,因为在我的情况下,onesignal 插件只更新了 gms 库版本而不是 firebase 版本。所以任何遇到这个问题的人都不会搜索this问题中使用的关键字。

【问题讨论】:

您将哪些 Firebase 依赖升级到 16.0.0? firebase-core 和 firebase-invites..我在 gradle 中只有这两个 Highest firebase version code is used for compiling play services library too的可能重复 是的,我没有遇到它,因为我什至没想到它与 onesignal 相关,因为它工作正常并且在更新 firebase 后出现问题 另请注意,在我的情况下,onesignal 插件正在更新 gms 库版本而不是 firebase 。因此,遇到此问题的任何人都不会搜索 this 问题中使用的关键字。 【参考方案1】:

相信你也遇到了和https://***.com/a/50516114/7070704的发帖者一样的问题,分辨率一样。

基本上,com.onesignal.androidsdk.onesignal-gradle-plugin 插件会迫使您将依赖项提升到不存在的东西上。

【讨论】:

老兄,非常感谢!我什至没想到这个问题可能与那个愚蠢的插件有关,因为它以前运行良好。通过将 onesignal 插件版本更新为 0.10.1 解决了该问题...我还将 onesignal 依赖项更新为 3.9.1 还从 onesignal 中排除了 firebase-messaging,因为它很旧,并且会产生与 firebase-iid 相关的冲突,firebase-iid 也包含在 firebase-invites 中。在 17.0.0 版本中单独添加了 firebase-messaging

以上是关于将 firebase 库更新到 16.0.0 会引发 google play services 依赖问题的主要内容,如果未能解决你的问题,请参考以下文章

Firestore:库中的包引用无效

React v15.5.0更新说明 & v16.0.0更新预告

[使用AWS lambda函数每1小时更新Firebase数据库

Firebase 选项中未定义存储桶。将个人资料照片更新到 Firebase

修复更新后显示错误的 android studio Firebase 广告库

VirtualEnv 16.0.0 发布,创建独立 Python 环境的工具