java.lang.ClassNotFoundException без имени класса - PullRequest
0 голосов
/ 02 октября 2019

У меня есть игра Unity, развернутая на Android.

В консоли Google Play я вижу много сбоев в старых версиях Android (<= 7.1). Сбой вызван ClassNotFoundException, но в отчете не отображается класс, который не найден. </p>

В консоли сбоев я получаю следующую трассировку стека:

java.lang.RuntimeException: 
  at android.app.ActivityThread.handleReceiver (ActivityThread.java:3025)
  at android.app.ActivityThread.-wrap18 (ActivityThread.java)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1565)
  at android.os.Handler.dispatchMessage (Handler.java:102)
  at android.os.Looper.loop (Looper.java:179)
  at android.app.ActivityThread.main (ActivityThread.java:6152)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:886)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:776)
Caused by: java.lang.ClassNotFoundException: 
  at dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:56)
  at java.lang.ClassLoader.loadClass (ClassLoader.java:380)
  at java.lang.ClassLoader.loadClass (ClassLoader.java:312)
  at android.app.ActivityThread.handleReceiver (ActivityThread.java:3020)

Что слишкоми не указывает на то, какой класс отсутствует.

Мне было интересно, есть ли другой способ найти отсутствующий класс. Я использую Multidex (я не знаю, если это связано с проблемой).

Любая помощь будет оценена здесь ..

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Итак, я обнаружил причину ClassNotFoundException, которая была не мультидекс-конфигурацией, а Receiver, который один из моих плагинов добавил в манифест с классом, который не был включен в проект.

Более важноВот как я нашел это, это может помочь другим ... похоже, что консоль Google Play не показывает все данные об исключениях, если это многострочное сообщение. Я установил Firebase Crashlytics и через несколько часов получил реальный пропавший класс.

Вот что вы получаете в консоли Google Play:

Caused by: java.lang.ClassNotFoundException: 
  at dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:56)
  at java.lang.ClassLoader.loadClass (ClassLoader.java:380)
  at java.lang.ClassLoader.loadClass (ClassLoader.java:312)
  at android.app.ActivityThread.handleReceiver (ActivityThread.java:3049)

Вот что вы получаете в Firebase Crashlytics:

Caused by java.lang.ClassNotFoundException
Didn't find class "com.mintegral.msdk.click.AppReceiver" on path: DexPathList[[zip file "/data/app/com.bbumgames.spadesroyale-1/base.apk", zip file "/data/app/com.bbumgames.spadesroyale-1/split_config.arm64_v8a.apk"],nativeLibraryDirectories=[/data/app/com.bbumgames.spadesroyale-1/lib/arm64, /data/app/com.bbumgames.spadesroyale-1/base.apk!/lib/arm64-v8a, /data/app/com.bbumgames.spadesroyale-1/split_config.arm64_v8a.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]

Я не уверен, почему Google не показывает вторую строку, мне кажется, что это ошибка, но в любом случае моя проблема теперь решена.

0 голосов
/ 02 октября 2019

Это может быть проблема мультиплекса. В свой build.gradle (уровень модуля) добавьте следующее, если его там еще нет:

android {
    defaultConfig {
        ...
        multiDexEnabled true
    }
    ...
}

dependencies {
  implementation 'com.android.support:multidex:1.0.3’
}

Если у вас нет класса приложения в вашем приложении, добавьте его в манифест (в теге приложения):

android:name="android.support.multidex.MultiDexApplication"

Если вы это сделаете, то добавьте:

public class MyApplication extends SomeOtherApplication {
      @Override
      protected void attachBaseContext(Context base) {
         super.attachBaseContext(base);
         MultiDex.install(this);
      }
    }

Подробнее об этом здесь

...