Как исправить исключение dalvik.system.BaseDexClassLoader.findClass ClassNotFoundException на Android? - PullRequest
0 голосов
/ 10 сентября 2018

Я получаю отчет о сбое dalvik.system.BaseDexClassLoader.findClass ClassNotFoundException в консоли Google Play. Авария почти исключительно для Samsung Galaxy 7-9 с OS 8 Oreo, 5% пользователей. У меня есть Samsung 7 с Oreo в офисе, и я попробовал все устройства в лаборатории удаленного тестирования Samsung, но не могу воспроизвести сбой. Сбой происходит с мультидексом или без него, я очистил кеш, перестроил и отключил Instant Run. Эта проблема не возникала, пока я не изменил targetSdkVersion на 26. Android Studio, сборка Gradle. Поскольку я не могу воспроизвести сбой, я вынужден делать случайные изменения и загружать их в PlayStore, а затем проверять отчеты о сбоях на следующий день. Заранее спасибо!

Samsung Galaxy S9 (starqltesq), Android 8.0
Report 1

java.lang.RuntimeException: 
  at android.app.ActivityThread.handleReceiver (ActivityThread.java:3374)
  at android.app.ActivityThread.-wrap18 (Unknown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1780)
  at android.os.Handler.dispatchMessage (Handler.java:105)
  at android.os.Looper.loop (Looper.java:164)
  at android.app.ActivityThread.main (ActivityThread.java:6938)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:327)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1374)
Caused by: java.lang.ClassNotFoundException: 
  at dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:93)
  at java.lang.ClassLoader.loadClass (ClassLoader.java:379)
  at java.lang.ClassLoader.loadClass (ClassLoader.java:312)
  at android.app.ActivityThread.handleReceiver (ActivityThread.java:3369)

Отредактированная сборка приложения .gradle:

android {
    compileSdkVersion 27
    buildToolsVersion '25.0.0'
    useLibrary 'org.apache.http.legacy'

    defaultConfig {
        minSdkVersion 17
        targetSdkVersion 26
        multiDexEnabled false
    }
    buildTypes {
        release {
            minifyEnabled false
            if (is_main_app) {
                signingConfig signingConfigs.releaseMain
            } else if (is_simutrader_app) {
                signingConfig signingConfigs.releaseSimutrader
            } else {
                signingConfig signingConfigs.releaseTsx
            }
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    dependencies {
    androidTestCompile 'junit:junit:4.12'
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile project(':volley')
    compile files('libs/gson-2.3.1.jar')
    compile 'io.branch.sdk.android:library:1.+'
    compile files('libs/mpandroidchartlibrary-2-0-9.jar')
    compile 'com.thebluealliance:spectrum:0.5.0'
    compile 'com.bignerdranch.android:recyclerview-multiselect:0.2'
    compile 'com.android.support:appcompat-v7:27.1.0'
    compile 'com.android.support:cardview-v7:27.1.0'
    compile 'com.android.support:design:27.1.0'
    compile 'com.android.support:support-v4:27.1.0'
    compile 'com.astuetz:pagerslidingtabstrip:1.0.1'
    compile 'com.astuetz:pagerslidingtabstrip:1.0.1'
    compile 'com.google.android.gms:play-services-gcm:11.+'
    compile 'com.google.android.gms:play-services-analytics:11.+'

    compile 'com.google.firebase:firebase-core:11.+'

    compile 'com.urbanairship.android:urbanairship-sdk:8.7.+'
    // compile 'com.android.support:multidex:1.0.3'

}

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

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

У меня есть решение. Я добавил NewRelic в сборку и получил это:

CRASH TYPE SUMMARY
LOCATION
BaseDexClassLoader.java line 93 in dalvik.system.BaseDexClassLoader.findClass()
EXCEPTION
java.lang.ClassNotFoundException
MESSAGE
Didn't find class "com.urbanairship.push.GCMPushReceiver" on path: DexPathList[[zip file "/data/app/com.****.android-tUaBU1BXe0VaMGy9WlkUGA==/base.apk"],nativeLibraryDirectories=[/data/app/com.*****.android-tUaBU1BXe0VaMGy9WlkUGA==/lib/arm64, /system/lib64, /system/vendor/lib64]]

Что говорит мне, что виновником был com.urbanairship.push.GCMPushReceiver. Таким образом, библиотека отслеживания является полезным инструментом для решения проблем. Спасибо за ответы!

p.s. Как общее наблюдение, многие из SO "вы пытались изменить ... вставить случайную настройку ...? Это гарантированно сработает!" ответы во многом не очень полезны.

0 голосов
/ 10 сентября 2018

Вы можете следовать инструкциям на странице разработчиков Android: https://developer.android.com/studio/build/multidex.html

Редактировать файл app.gradle с этим кодом,

defaultConfig {
...
minSdkVersion // your version
targetSdkVersion // your version 
...

// Enabling multidex support.
 multiDexEnabled true
}

dependencies {
  compile 'com.android.support:multidex:1.0.1'
}

Я думаю, это будет полезно.

...