1

Currently in my production app I am noticing this error:

java.lang.RuntimeException: 
  at android.app.ActivityThread.handleReceiver (ActivityThread.java:2648)
  at android.app.ActivityThread.access$1700 (ActivityThread.java:166)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1359)
  at android.os.Handler.dispatchMessage (Handler.java:102)
  at android.os.Looper.loop (Looper.java:136)
  at android.app.ActivityThread.main (ActivityThread.java:5584)
  at java.lang.reflect.Method.invokeNative (Native Method)
  at java.lang.reflect.Method.invoke (Method.java:515)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1268)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1084)
  at dalvik.system.NativeStart.main (Native Method)

and found out it is because of conflicting libraries. I am using around 7 and they all are necessary for the app to function correctly. I did the ./gradlew app:dependencies and saw a bunch of conflicts (mainly the android.support and also google-services) and I have to resolve them now with the exclude tag.

My question is how do I properly set the correct versions? Do I force all libs to go to the smallest version of a certain lib or do I just force them all to the latest?

Sorry for the noob question I am fairly new to managin libs in android.

EDIT: more of the stacktrace

Caused by: java.lang.ClassNotFoundException: 
  at dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:56)
  at java.lang.ClassLoader.loadClass (ClassLoader.java:497)
  at java.lang.ClassLoader.loadClass (ClassLoader.java:457)
  at android.app.ActivityThread.handleReceiver (ActivityThread.java:2643)

Also a similar error but with different stack trace.

app/build.gradle:

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

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

def enableSeparateBuildPerCPUArchitecture = false

def enableProguardInReleaseBuilds = false

android {
compileSdkVersion 28
buildToolsVersion "28.0.2"

    defaultConfig {
        applicationId "com.lisdoworker"
        minSdkVersion 18
        targetSdkVersion 28
        versionCode 15
        versionName "1.1"
        ndk {
            abiFilters "armeabi-v7a", "x86"
        }
        manifestPlaceholders = [
            tipsiStripeRedirectScheme: "example"
        ]
        multiDexEnabled true
    }
    signingConfigs {
        release {
            storeFile file(MYAPP_RELEASE_STORE_FILE)
            storePassword MYAPP_RELEASE_STORE_PASSWORD
            keyAlias MYAPP_RELEASE_KEY_ALIAS
            keyPassword MYAPP_RELEASE_KEY_PASSWORD
        }
    }
    splits {
        abi {
            reset()
            enable enableSeparateBuildPerCPUArchitecture
            universalApk false  // If true, also generate a universal APK
            include "armeabi-v7a", "x86"
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.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
            }
        }
    }
    dexOptions {
        jumboMode true
    }
}

dependencies {
    // react-native-firebase
    implementation project(':react-native-firebase')

    implementation "com.google.firebase:firebase-core:16.0.4"
    implementation "com.google.firebase:firebase-messaging:17.3.4"
    implementation 'me.leolin:ShortcutBadger:1.1.21@aar'

    implementation(project(':react-native-google-places')){
        exclude group: 'com.google.android.gms', module: 'play-services-base'
        exclude group: 'com.google.android.gms', module: 'play-services-places'
        exclude group: 'com.google.android.gms', module: 'play-services-location'
    }

    implementation 'com.google.android.gms:play-services-base:16.+'
    implementation 'com.google.android.gms:play-services-places:16.+'
    implementation 'com.google.android.gms:play-services-location:16.+'
    implementation 'com.google.android.gms:play-services-wallet:16.+'
    implementation 'com.google.android.gms:play-services-identity:16.+'

    implementation project(':tipsi-stripe')
    implementation project(':react-native-linear-gradient')
    implementation project(':react-native-fast-image')

    implementation project(':react-native-vector-icons')
    implementation project(':react-native-image-picker')
    implementation project(':react-native-fetch-blob')
    implementation project(':react-native-fbsdk')

    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation "com.android.support:appcompat-v7:27.1.0"

    implementation "com.facebook.react:react-native:+"  // From node_modules
}

// 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'
}

apply plugin: 'com.google.gms.google-services'
com.google.gms.googleservices.GoogleServicesPlugin.config.disableVersionCheck = true
Walter Monecke
  • 2,386
  • 1
  • 19
  • 52
  • That's unlikely to be the cause of your problem. Please post the full stack trace (this is likely only half of it). But there's nothing here that even remotely looks like a library conflict problem. – Gabe Sechan Dec 31 '18 at 00:26
  • Even if not the cause of this, you should resolve the library conflicts. Usually, you would want to keep the later ones. Maybe also upgrade some libs that do not directly conflict (but cause conflicts by bringing in old dependencies.) – Henry Dec 31 '18 at 07:59
  • @GabeSechan I updated the stacktrace I found on the Google Play Console. – Walter Monecke Dec 31 '18 at 16:13
  • @Henry What if some libraries are not available in the later versions of some other libs? Do I downgrade everything to the most latest version that everything is compatible with? – Walter Monecke Dec 31 '18 at 16:16
  • What do you mean "not available in the later versions of some other libs"? They are no longer used? – Henry Dec 31 '18 at 16:19
  • @Henry not that they are not longer maintained but the owners have not updated support and google service libs to the latest version. Btw any ideas on what else it could be other than a conflict between the libs? – Walter Monecke Dec 31 '18 at 16:22
  • @WalterMonecke this is a `multidex` issue; caused by adding one dependency too much. unless enabling `multidex`, this will not be properly backwards-compatible with the `Dalvik` VM. it should still build, but missing some of the classes, which subsequently leads to `ClassNotFoundException`. see https://developer.android.com/studio/build/multidex – Martin Zeitler Dec 31 '18 at 16:28
  • @MartinZeitler Thanks for the comment! However I do have multidex enabled and I have doublechecked my dependencies. Will update the question with my build.gradle. – Walter Monecke Dec 31 '18 at 16:38

1 Answers1

1

due to minSdkVersion 18 you have to add a dependency to com.android.support:multidex:1.0.3 for proper Dalvik VM support.

the Manifest.xml needs to have the Application class referenced, too.

and to answer the actual question; first of all remove this one line:

com.google.gms.googleservices.GoogleServicesPlugin.config.disableVersionCheck = true

then update buildToolsVersionto 28.0.3 and get rid of these 16.+ version numbers.

static version numbers lead to rather reproducible results, compared to the + notation. alike this one has to manually update these version numbers - but at least one knows which version number was updated and to which version number one has to to revert, in case of issues (it's worth the effort).

com.android.support:appcompat-v7:27.1.0 could also updated to 28.0.0.

after that Android Studio should underline some dependencies in red - providing a clue which com.google.android.gms and com.android.support may need to be excluded - or added. eg. support-v4 is a common candidate for exclusion - but it has to be added at a matching version.

Martin Zeitler
  • 1
  • 19
  • 155
  • 216