react-native-device-info使Android上的应用程序崩溃

时间:2018-06-26 07:02:58

标签: android reactjs react-native

我在react-native中使用react-native-device-info库。我已经使用了大约一年了,没有问题,但是自从最近两周以来,Android上的应用程序由于该库而崩溃。

我收到如下错误:

enter image description here

他们讨论了此问题here。他们的解释如下:

  

无法合并dex /多个dex文件/存在问题   context_object_name react-native-device-info的使用   com.google.android.gms:play-services-gcm提供   [getInstance()] [#getinstance]。这可能导致冲突   构建Android应用程序。

     

如果您使用的是其他版本的   com.google.android.gms:play-services-gcm在您的应用中,您可以定义   build.gradle中的googlePlayServicesVersion gradle变量   文件来告诉react-native-device-info它应该要求哪个版本。

     

如果您使用的其他库与   com.google.android.gms:play-services-gcm,您可以直接忽略它   gradle文件中的依赖项:

com.google.android.gms

我尝试将代码添加到compile(project(':react-native-device-info')) { exclude group: 'com.google.android.gms' } ,但没有发生任何问题,sam问题。

我不确定如何解决。有想法吗?

1 个答案:

答案 0 :(得分:3)

将您的app/build.gradle依赖项更改如下:

dependencies {
  ...
  compile project(':react-native-device-info')
  compile('com.google.android.gms:play-services-gcm:11.8.0') {
      force = true
  }
}

如果11.8.0不起作用,请尝试将其替换为+react-native-device-info+用于com.google.android.gms:play-services-gcm依赖项。

更新

如果这不起作用,请按照错误消息中的建议进行操作->尝试将def googlePlayServicesVersion = "11.8.0"添加到app/build.gradle中以强制在react-native-device-info上使用该版本。 (您可以根据需要更改版本)

然后将您的依赖项更改如下:

dependencies {
  ...
  compile "com.google.android.gms:play-services-gcm:$googlePlayServicesVersion"
} 

如果您查看他们的build.gradle文件,他们将按照以下方式处理其依赖项:

...
def DEFAULT_GOOGLE_PLAY_SERVICES_VERSION    = "+"     
...
dependencies {
  def googlePlayServicesVersion = project.hasProperty('googlePlayServicesVersion') ? project.googlePlayServicesVersion : DEFAULT_GOOGLE_PLAY_SERVICES_VERSION

  compile 'com.facebook.react:react-native:+'
  compile "com.google.android.gms:play-services-gcm:$googlePlayServicesVersion"
}

更新

  

(这是可行的解决方案)

如果这不起作用,请尝试将项目级别的build.gradle文件更改为以下格式(存储库顺序很重要):

buildscript {
  repositories {
    maven {
        url 'https://maven.google.com/'
        name 'Google'
    }
    mavenCentral()
    jcenter()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:3.1.1'

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
  }
}

allprojects {
  repositories {
    maven {
        url 'https://maven.google.com/'
        name 'Google'
    }
    mavenLocal()
    jcenter()
    maven {
        // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
        url "$rootDir/../node_modules/react-native/android"
    }
  }
}

存储库的顺序很重要,因为例如,如果首先使用jcenter(),并且它将在其中找到com.google.android.gms程序包,它将检索那些源,并且它们可能是错误的那些。在您的情况下,maven {Google...}元素指向您需要的源,这就是为什么在使用jcenter()之前必须调用它的原因。