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