Errors adding dependency with react-native

872 Views Asked by At

I'm creating an application using react-native. So far I have implemented a few modules like react-native-camera and react-native-maps.

Everything was working fine until I tried to implement react-native-push-notification.

I followed their implementation using this tutorial, but now, even though the app builds succesfully, it crashes on start up.

This is my logcat (It's actually cropped 'cause it wouldn't fit here)

11-19 18:29:15.419 29371 29456 I art     : Rejecting re-init on previously-failed class java.lang.Class<com.google.android.gms.maps.model.Cap>: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/common/internal/safeparcel/zza;
11-19 18:29:15.419 29371 29456 I art     :   at java.util.List com.airbnb.android.react.maps.MapsPackage.createViewManagers(com.facebook.react.bridge.ReactApplicationContext) (MapsPackage.java:36)
11-19 18:29:15.419 29371 29456 I art     :   at java.util.List com.facebook.react.ReactInstanceManager.getOrCreateViewManagers(com.facebook.react.bridge.ReactApplicationContext) (ReactInstanceManager.java:753)
11-19 18:29:15.419 29371 29456 I art     :   at com.facebook.react.uimanager.UIManagerModule com.facebook.react.CoreModulesPackage.createUIManager(com.facebook.react.bridge.ReactApplicationContext) (CoreModulesPackage.java:168)
11-19 18:29:15.419 29371 29456 I art     :   at com.facebook.react.uimanager.UIManagerModule com.facebook.react.CoreModulesPackage.access$200(com.facebook.react.CoreModulesPackage, com.facebook.react.bridge.ReactApplicationContext) (CoreModulesPackage.java:52)
11-19 18:29:15.419 29371 29456 I art     :   at com.facebook.react.bridge.NativeModule com.facebook.react.CoreModulesPackage$7.get() (CoreModulesPackage.java:126)
11-19 18:29:15.419 29371 29456 I art     :   at java.lang.Object com.facebook.react.CoreModulesPackage$7.get() (CoreModulesPackage.java:123)
11-19 18:29:15.419 29371 29456 I art     :   at void com.facebook.react.NativeModuleRegistryBuilder.processPackage(com.facebook.react.ReactPackage) (NativeModuleRegistryBuilder.java:61)
11-19 18:29:15.419 29371 29456 I art     :   at void com.facebook.react.ReactInstanceManager.processPackage(com.facebook.react.ReactPackage, com.facebook.react.NativeModuleRegistryBuilder) (ReactInstanceManager.java:1171)
11-19 18:29:15.419 29371 29456 I art     :   at com.facebook.react.bridge.NativeModuleRegistry com.facebook.react.ReactInstanceManager.processPackages(com.facebook.react.bridge.ReactApplicationContext, java.util.List, boolean) (ReactInstanceManager.java:1141)
11-19 18:29:15.419 29371 29456 I art     :   at com.facebook.react.bridge.ReactApplicationContext com.facebook.react.ReactInstanceManager.createReactContext(com.facebook.react.bridge.JavaScriptExecutor, com.facebook.react.bridge.JSBundleLoader) (ReactInstanceManager.java:1083)
11-19 18:29:15.419 29371 29456 I art     :   at com.facebook.react.bridge.ReactApplicationContext com.facebook.react.ReactInstanceManager.access$900(com.facebook.react.ReactInstanceManager, com.facebook.react.bridge.JavaScriptExecutor, com.facebook.react.bridge.JSBundleLoader) (ReactInstanceManager.java:116)
11-19 18:29:15.419 29371 29456 I art     :   at void com.facebook.react.ReactInstanceManager$5.run() (ReactInstanceManager.java:913)
11-19 18:29:15.419 29371 29456 I art     :   at void java.lang.Thread.run() (Thread.java:762)
11-19 18:29:15.419 29371 29456 I art     : Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.common.internal.safeparcel.zza" on path: DexPathList[[zip file "/data/app/com.dpassapp-2/base.apk"],nativeLibraryDirectories=[/data/app/com.dpassapp-2/lib/arm, /data/app/com.dpassapp-2/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib]]
11-19 18:29:15.419 29371 29456 I art     :   at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:56)
11-19 18:29:15.419 29371 29456 I art     :   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:380)
11-19 18:29:15.419 29371 29456 I art     :   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
11-19 18:29:15.419 29371 29456 I art     :   at java.util.List com.airbnb.android.react.maps.MapsPackage.createViewManagers(com.facebook.react.bridge.ReactApplicationContext) (MapsPackage.java:36)
11-19 18:29:15.419 29371 29456 I art     :   at java.util.List com.facebook.react.ReactInstanceManager.getOrCreateViewManagers(com.facebook.react.bridge.ReactApplicationContext) (ReactInstanceManager.java:753)
11-19 18:29:15.419 29371 29456 I art     :   at com.facebook.react.uimanager.UIManagerModule com.facebook.react.CoreModulesPackage.createUIManager(com.facebook.react.bridge.ReactApplicationContext) (CoreModulesPackage.java:168)
11-19 18:29:15.419 29371 29456 I art     :   at com.facebook.react.uimanager.UIManagerModule com.facebook.react.CoreModulesPackage.access$200(com.facebook.react.CoreModulesPackage, com.facebook.react.bridge.ReactApplicationContext) (CoreModulesPackage.java:52)
11-19 18:29:15.419 29371 29456 I art     :   at com.facebook.react.bridge.NativeModule com.facebook.react.CoreModulesPackage$7.get() (CoreModulesPackage.java:126)
11-19 18:29:15.419 29371 29456 I art     :   at java.lang.Object com.facebook.react.CoreModulesPackage$7.get() (CoreModulesPackage.java:123)
11-19 18:29:15.419 29371 29456 I art     :   at void com.facebook.react.NativeModuleRegistryBuilder.processPackage(com.facebook.react.ReactPackage) (NativeModuleRegistryBuilder.java:61)
11-19 18:29:15.419 29371 29456 I art     :   at void com.facebook.react.ReactInstanceManager.processPackage(com.facebook.react.ReactPackage, com.facebook.react.NativeModuleRegistryBuilder) (ReactInstanceManager.java:1171)
11-19 18:29:15.419 29371 29456 I art     :   at com.facebook.react.bridge.NativeModuleRegistry com.facebook.react.ReactInstanceManager.processPackages(com.facebook.react.bridge.ReactApplicationContext, java.util.List, boolean) (ReactInstanceManager.java:1141)
11-19 18:29:15.419 29371 29456 I art     :   at com.facebook.react.bridge.ReactApplicationContext com.facebook.react.ReactInstanceManager.createReactContext(com.facebook.react.bridge.JavaScriptExecutor, com.facebook.react.bridge.JSBundleLoader) (ReactInstanceManager.java:1083)
11-19 18:29:15.419 29371 29456 I art     :   at com.facebook.react.bridge.ReactApplicationContext com.facebook.react.ReactInstanceManager.access$900(com.facebook.react.ReactInstanceManager, com.facebook.react.bridge.JavaScriptExecutor, com.facebook.react.bridge.JSBundleLoader) (ReactInstanceManager.java:116)
11-19 18:29:15.419 29371 29456 I art     :   at void com.facebook.react.ReactInstanceManager$5.run() (ReactInstanceManager.java:913)
11-19 18:29:15.419 29371 29456 I art     :   at void java.lang.Thread.run() (Thread.java:762)

Searching online I found that this could be a dependency version conflict. So I checked my dependency tree and noticed that there was another module I was using that also uses com.google.android.gms:play-services-gcm, but in a different version. So I changed the version in my application level build.gradle to match the other version, but still I get the same error.

This is the dependecy tree from my project:

releaseRuntimeClasspath - Resolved configuration for runtime for variant: release
+--- com.android.support:appcompat-v7:26.1.0 -> 27.1.1
|    +--- com.android.support:support-annotations:27.1.1
|    +--- com.android.support:support-core-utils:27.1.1
|    |    +--- com.android.support:support-annotations:27.1.1
|    |    \--- com.android.support:support-compat:27.1.1
|    |         +--- com.android.support:support-annotations:27.1.1
|    |         \--- android.arch.lifecycle:runtime:1.1.0
|    |              +--- android.arch.lifecycle:common:1.1.0
|    |              \--- android.arch.core:common:1.1.0
|    +--- com.android.support:support-fragment:27.1.1
|    |    +--- com.android.support:support-compat:27.1.1 (*)
|    |    +--- com.android.support:support-core-ui:27.1.1
|    |    |    +--- com.android.support:support-annotations:27.1.1
|    |    |    +--- com.android.support:support-compat:27.1.1 (*)
|    |    |    \--- com.android.support:support-core-utils:27.1.1 (*)
|    |    +--- com.android.support:support-core-utils:27.1.1 (*)
|    |    +--- com.android.support:support-annotations:27.1.1
|    |    +--- android.arch.lifecycle:livedata-core:1.1.0
|    |    |    +--- android.arch.lifecycle:common:1.1.0
|    |    |    +--- android.arch.core:common:1.1.0
|    |    |    \--- android.arch.core:runtime:1.1.0
|    |    |         \--- android.arch.core:common:1.1.0
|    |    \--- android.arch.lifecycle:viewmodel:1.1.0
|    +--- com.android.support:support-vector-drawable:27.1.1
|    |    +--- com.android.support:support-annotations:27.1.1
|    |    \--- com.android.support:support-compat:27.1.1 (*)
|    \--- com.android.support:animated-vector-drawable:27.1.1
|         +--- com.android.support:support-vector-drawable:27.1.1 (*)
|         \--- com.android.support:support-core-ui:27.1.1 (*)
+--- com.facebook.react:react-native:+ -> 0.57.4
|    +--- com.facebook.infer.annotation:infer-annotation:0.11.2
|    |    \--- com.google.code.findbugs:jsr305:3.0.1 -> 3.0.2
|    +--- javax.inject:javax.inject:1
|    +--- com.android.support:appcompat-v7:27.1.1 (*)
|    +--- com.facebook.fresco:fresco:1.10.0
|    |    +--- com.facebook.fresco:fbcore:1.10.0
|    |    +--- com.facebook.fresco:drawee:1.10.0
|    |    |    +--- com.facebook.fresco:fbcore:1.10.0
|    |    |    \--- com.facebook.fresco:imagepipeline:1.10.0
|    |    |         +--- com.facebook.fresco:imagepipeline-base:1.10.0
|    |    |         |    +--- com.facebook.soloader:soloader:0.5.0 -> 0.5.1
|    |    |         |    +--- com.parse.bolts:bolts-tasks:1.4.0
|    |    |         |    \--- com.facebook.fresco:fbcore:1.10.0
|    |    |         +--- com.facebook.soloader:soloader:0.5.0 -> 0.5.1
|    |    |         +--- com.parse.bolts:bolts-tasks:1.4.0
|    |    |         \--- com.facebook.fresco:fbcore:1.10.0
|    |    +--- com.facebook.fresco:imagepipeline:1.10.0 (*)
|    |    \--- com.facebook.soloader:soloader:0.5.0 -> 0.5.1
|    +--- com.facebook.fresco:imagepipeline-okhttp3:1.10.0
|    |    +--- com.squareup.okhttp3:okhttp:3.10.0 -> 3.11.0
|    |    |    \--- com.squareup.okio:okio:1.14.0
|    |    +--- com.facebook.fresco:fbcore:1.10.0
|    |    \--- com.facebook.fresco:imagepipeline:1.10.0 (*)
|    +--- com.facebook.soloader:soloader:0.5.1
|    +--- com.google.code.findbugs:jsr305:3.0.2
|    +--- com.squareup.okhttp3:okhttp:3.11.0 (*)
|    +--- com.squareup.okhttp3:okhttp-urlconnection:3.11.0
|    |    \--- com.squareup.okhttp3:okhttp:3.11.0 (*)
|    +--- com.squareup.okio:okio:1.14.0
|    \--- org.webkit:android-jsc:r174650
+--- project :react-native-ble-manager
|    \--- com.facebook.react:react-native:[0.30.0,) -> 0.57.4 (*)
+--- project :react-native-camera
|    +--- com.google.zxing:core:3.3.0
|    +--- com.drewnoakes:metadata-extractor:2.9.1
|    |    \--- com.adobe.xmp:xmpcore:5.1.2
|    +--- com.google.android.gms:play-services-vision:11.0.4
|    |    +--- com.google.android.gms:play-services-base:[11.0.4] -> 16.0.1
|    |    |    +--- com.google.android.gms:play-services-basement:16.0.1
|    |    |    |    \--- com.android.support:support-v4:26.1.0
|    |    |    |         +--- com.android.support:support-compat:26.1.0 -> 27.1.1 (*)
|    |    |    |         +--- com.android.support:support-media-compat:26.1.0
|    |    |    |         |    +--- com.android.support:support-annotations:26.1.0 -> 27.1.1
|    |    |    |         |    \--- com.android.support:support-compat:26.1.0 -> 27.1.1 (*)
|    |    |    |         +--- com.android.support:support-core-utils:26.1.0 -> 27.1.1 (*)
|    |    |    |         +--- com.android.support:support-core-ui:26.1.0 -> 27.1.1 (*)
|    |    |    |         \--- com.android.support:support-fragment:26.1.0 -> 27.1.1 (*)
|    |    |    \--- com.google.android.gms:play-services-tasks:16.0.1
|    |    |         \--- com.google.android.gms:play-services-basement:16.0.1 (*)
|    |    +--- com.google.android.gms:play-services-basement:[11.0.4] -> 16.0.1 (*)
|    |    \--- com.google.android.gms:play-services-vision-common:[11.0.4] -> 11.0.4
|    |         +--- com.google.android.gms:play-services-base:[11.0.4] -> 16.0.1 (*)
|    |         \--- com.google.android.gms:play-services-basement:[11.0.4] -> 16.0.1 (*)
|    +--- com.android.support:exifinterface:26.1.0
|    |    \--- com.android.support:support-annotations:26.1.0 -> 27.1.1
|    +--- com.android.support:support-annotations:26.1.0 -> 27.1.1
|    \--- com.android.support:support-v4:26.1.0 (*)
+--- project :react-native-vector-icons
|    \--- com.facebook.react:react-native:+ -> 0.57.4 (*)
+--- project :react-native-maps
|    +--- com.google.android.gms:play-services-base:11.0.4 -> 16.0.1 (*)
|    +--- com.google.android.gms:play-services-maps:11.0.4
|    |    +--- com.google.android.gms:play-services-base:[11.0.4] -> 16.0.1 (*)
|    |    \--- com.google.android.gms:play-services-basement:[11.0.4] -> 16.0.1 (*)
|    \--- com.google.maps.android:android-maps-utils:0.5+ -> 0.5
+--- project :react-native-push-notification
|    +--- com.android.support:appcompat-v7:26.1.0 -> 27.1.1 (*)
|    +--- com.facebook.react:react-native:+ -> 0.57.4 (*)
|    +--- com.google.android.gms:play-services-gcm:11.0.4
|    |    +--- com.google.android.gms:play-services-base:[11.0.4] -> 16.0.1 (*)
|    |    +--- com.google.android.gms:play-services-basement:[11.0.4] -> 16.0.1 (*)
|    |    \--- com.google.android.gms:play-services-iid:[11.0.4] -> 11.0.4
|    |         +--- com.google.android.gms:play-services-base:[11.0.4] -> 16.0.1 (*)
|    |         \--- com.google.android.gms:play-services-basement:[11.0.4] -> 16.0.1 (*)
|    +--- me.leolin:ShortcutBadger:1.1.8
|    \--- com.google.firebase:firebase-messaging:+ -> 17.3.4
|         +--- com.google.android.gms:play-services-basement:16.0.1 (*)
|         +--- com.google.android.gms:play-services-tasks:16.0.1 (*)
|         +--- com.google.firebase:firebase-common:16.0.3
|         |    +--- com.google.android.gms:play-services-basement:16.0.1 (*)
|         |    \--- com.google.android.gms:play-services-tasks:16.0.1 (*)
|         +--- com.google.firebase:firebase-iid:[17.0.4] -> 17.0.4
|         |    +--- com.google.android.gms:play-services-basement:16.0.1 (*)
|         |    +--- com.google.android.gms:play-services-stats:16.0.1
|         |    |    \--- com.google.android.gms:play-services-basement:16.0.1 (*)
|         |    +--- com.google.android.gms:play-services-tasks:16.0.1 (*)
|         |    +--- com.google.firebase:firebase-common:16.0.3 (*)
|         |    \--- com.google.firebase:firebase-iid-interop:16.0.1
|         |         +--- com.google.android.gms:play-services-base:16.0.1 (*)
|         |         \--- com.google.android.gms:play-services-basement:16.0.1 (*)
|         \--- com.google.firebase:firebase-measurement-connector:17.0.1
|              \--- com.google.android.gms:play-services-basement:16.0.1 (*)
+--- com.google.android.gms:play-services-gcm:11.0.4 (*)
\--- project :react-native-barcode-scanner-google
     +--- com.google.android.gms:play-services-vision:11.0.4 (*)
     \--- com.facebook.react:react-native:0.20.+ -> 0.57.4 (*)

I see that there are some mismatching versions, but I don't really know how to correctly track or correct them.

This is my build.gradle:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext {
        buildToolsVersion = "27.0.3"
        minSdkVersion = 19
        compileSdkVersion = 27
        targetSdkVersion = 26
        supportLibVersion = "27.1.1"
    }
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.4'
    }
}

allprojects {
    repositories {
        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"
        }
    }
}

ext {
    compileSdkVersion   = 26
    targetSdkVersion    = 26
    buildToolsVersion   = "26.0.2"
    supportLibVersion   = "26.1.0"
    googlePlayServicesVersion = "11.0.4"
    androidMapsUtilsVersion = "0.5+"
}

task wrapper(type: Wrapper) {
    gradleVersion = '4.4'
    distributionUrl = distributionUrl.replace("bin", "all")
}

// Application level
apply plugin: "com.android.application"

import com.android.build.OutputFile

project.ext.react = [
    entryFile: "index.js"
]

apply from: "../../node_modules/react-native/react.gradle"

def enableSeparateBuildPerCPUArchitecture = false

def enableProguardInReleaseBuilds = false

android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion

    defaultConfig {
        applicationId "com.dpassapp"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName "1.0"
        ndk {
            abiFilters "armeabi-v7a", "x86"
        }
    }
    splits {
        abi {
            reset()
            enable enableSeparateBuildPerCPUArchitecture
            universalApk false  // If true, also generate a universal APK
            include "armeabi-v7a", "x86"
        }
    }
    buildTypes {
        release {
            minifyEnabled enableProguardInReleaseBuilds
            proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
        }
    }
    // applicationVariants are e.g. debug, release
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            // For each separate APK per architecture, set a unique version code as described here:
            // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
            def versionCodes = ["armeabi-v7a":1, "x86":2]
            def abi = output.getFilter(OutputFile.ABI)
            if (abi != null) {  // null for the universal-debug, universal-release variants
                output.versionCodeOverride =
                        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
            }
        }
    }
}

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
    implementation "com.facebook.react:react-native:+"  // From node_modules

    implementation project(':react-native-ble-manager')
    implementation project(':react-native-camera')
    implementation project(':react-native-vector-icons')
    implementation project(':react-native-maps')

    implementation project(':react-native-push-notification')
    implementation ('com.google.android.gms:play-services-gcm:11.0.4') {
        force = true;
    }

    implementation project(':react-native-barcode-scanner-google')
}

// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task copyDownloadableDepsToLibs(type: Copy) {
    from configurations.compile
    into 'libs'
}

Does anyone know what could I be missing? Or how to properly debug depency version conflicts?

3

There are 3 best solutions below

0
On BEST ANSWER

I found that there were 2 (similar) reasons why my app was crashing.

  1. I had dependencies that required different versions of android support library
  2. I had dependencies that required different versions of google services libraries

The first one was easier to fix. But I had a really hard time figuring out why I couldn't force all google services to the same version, I kept getting errors messages that the libraries couldn't be found in the repository. The problem was not all dependencies have the same minor/patch versions (as listed here).

e.g.: com.google.android.gms:play-services-base latest version is 16.0.1 (doesn't even have 16.0.0), whereas com.google.android.gms:play.services.maps lastest version is 16.0.0. So If I hardcoded any of these version, the other one would throw a not found error.

To solve this, I had to force all google services libraries to the same major version, so it could fetch the correct version for each one.

Adding these lines to my top-level build.gradle solved it:

subprojects {
    project.configurations.all {
        resolutionStrategy.eachDependency { details ->

            // force all android support dependencies to 27.1.1
            if (details.requested.group == 'com.android.support'
                    && !details.requested.name.contains('multidex') ) {
                details.useVersion "27.1.1"
            }

            // force all google services libraries to the same latest major version
            if(details.requested.group == 'com.google.android.gms') {
                details.useVersion '16.+'
            }
        }
    }
}
0
On

Do this may help you :

react-native link

and

react-native link (your dependency name)

like this :

react-native link react-native-push-notification

I have an issue like yours and this helped me

good luck

0
On

In dependency version conflicts (such as Google Play Services) best thing to do is fix the dependency in the top level gradle as you have done and then exclude the dependency from conflicting libraries.

compile(project(":react-native-push-notification")){ exclude group: "com.google.android.gms" }

However, make sure the proper version compatible with all the dependencies are fixed in the top level gradle.