java.lang.ClassNotFoundException 没有 class 的名字

java.lang.ClassNotFoundException without the name of the class

我有一个 Unity 游戏部署到 Android。

在 Google 游戏机中,我看到许多崩溃发生在旧 Android 版本 (<=7.1) 上。崩溃是由 ClassNotFoundException 引起的,但报告没有显示未找到的 class。

在崩溃控制台中,我得到以下堆栈跟踪:

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)

过于笼统,没有提示 class 缺少什么。

我想知道是否有其他方法可以找到丢失的 class。我用的是Multidex(不知道是不是相关问题)

任何帮助将不胜感激..

这可能是一个多路复用问题。 在您的 build.gradle(模块级)中添加以下内容(如果还没有的话):

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

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

如果您的应用程序中没有应用程序 class,请将此添加到您的清单(在应用程序标签内):

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

如果您这样做,请添加:

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

Read more about it here

所以我找到了 ClassNotFoundException 的原因,这不是 multidex 配置,而是我的一个插件添加到清单中的 Receiver,其中 class 未包含在项目中。

更重要的是我是如何找到它的,这可以帮助其他人.. 如果是多行消息,Google 游戏控制台似乎不会显示完整的异常数据。我已经安装了 Firebase Crashlytics,并在几个小时内得到了实际丢失的 class.

这是您在 Google 游戏控制台中获得的内容:

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 没有显示第二行,对我来说似乎是一个错误,但无论如何,我的问题现在已经解决了。