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

本文主要是介绍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
###尝试

  • 这个问题可是折磨了我大半天,按照网上搜索的解决方式各种尝试

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
    然而,并没有什么卵用

解决方法

  • 之后静下心来好好思考了下,依赖版本冲突,肯定是存在重复依赖的问题。从这个思路着手:

第一步:

  • 将firebase的依赖版本更新到最新版,这样能尽可能的降低版本冲突的概率;
    参考firebase插件的各个发布版本
    https://firebase.google.com/support/release-notes/android#20180523

第二步:

  • 去除依赖冲突 参考 https://blog.csdn.net/yyo201/article/details/80570741
    在Teminal 里面输入 gradlew app:dependencies 回车之后等一会儿就可以查看到整个项目的依赖树结构了。

在这里插入图片描述
在这里插入图片描述

  • 在依赖树结构里搜索出现版本冲突的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引用版本冲突。

  • 那我们去除重复引用play-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包}
  • 现在编译,就能成功通过了。
其他可行方法
版本冲突

在同一个配置下(例如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参数

exclude后的参数有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同步时会直接报错。可使用exclude、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.

执行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同步成功,但是并不能代表编译时没有问题。由于不同版本可能不完全兼容,于是会出现各种奇怪的报错。已知的解决思路是更改包的版本、尝试强制使用不同版本的依赖项,找到可兼容的依赖组合。

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

这篇关于Firebase引用版本冲突解决:Android dependency 'com.google.android.gms:play-services-basement' has different的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/964581

相关文章

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

SpringBoot整合Dubbo+ZK注册失败的坑及解决

《SpringBoot整合Dubbo+ZK注册失败的坑及解决》使用Dubbo框架时,需在公共pom添加依赖,启动类加@EnableDubbo,实现类用@DubboService替代@Service,配... 目录1.先看下公共的pom(maven创建的pom工程)2.启动类上加@EnableDubbo3.实

MySQL逻辑删除与唯一索引冲突解决方案

《MySQL逻辑删除与唯一索引冲突解决方案》本文探讨MySQL逻辑删除与唯一索引冲突问题,提出四种解决方案:复合索引+时间戳、修改唯一字段、历史表、业务层校验,推荐方案1和方案3,适用于不同场景,感兴... 目录问题背景问题复现解决方案解决方案1.复合唯一索引 + 时间戳删除字段解决方案2:删除后修改唯一字

nginx中端口无权限的问题解决

《nginx中端口无权限的问题解决》当Nginx日志报错bind()to80failed(13:Permissiondenied)时,这通常是由于权限不足导致Nginx无法绑定到80端口,下面就来... 目录一、问题原因分析二、解决方案1. 以 root 权限运行 Nginx(不推荐)2. 为 Nginx

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class