在Crashlytics中没有显示的ClassNotFound崩溃,在Google Play控制台中显示。

11

我们正在尝试调试发生在某些用户身上的崩溃,但无法确定确切的原因。

在Google Play控制台中,我们看到了这个:

java.lang.RuntimeException:  
  at android.app.ActivityThread.handleReceiver (ActivityThread.java:3331)
  at android.app.ActivityThread.-wrap20 (ActivityThread.java)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1734) 
  at android.os.Handler.dispatchMessage (Handler.java:102) 
  at android.os.Looper.loop (Looper.java:154)
  at android.app.ActivityThread.main (ActivityThread.java:6688)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1468)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1358)
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:3326)

我们在项目中设置了Crashlytics,它是应用程序启动时加载的第一件事。我怀疑也许清单文件中缺少其中一个类,但我们已经查看过它(甚至反汇编APK以确保),它们都在。

我们怀疑可能是某个活动在初始化期间使用的类,但其中一些是第三方SDK,因此我们无法访问其源代码。

有没有办法看到未找到的类名?错误没有显示在Crashlytics上,我们也无法在我们拥有的任何设备/模拟器上重现该错误。

谢谢!

编辑:部分解决方案

问题最终在于我们使用的通知包需要AndroidManifest.xml中具有特定供应商条目(我们的测试设备中没有)。在重新集成几乎所有第三方服务之后,我们最终看到崩溃报告消失了。

我们无法实现我们的一般目标(从记录到Google Play开发者控制台的异常中获取异常文本而不仅仅是异常堆栈跟踪),因此没有“好”的方法(据我们所知)来找出缺少哪个类。相当令人失望。


你好,请问能否具体说明一下这个崩溃是在哪个Android操作系统版本上出现的?您是否已经运行了“lint”工具来检查您的应用程序,以便它可以告诉您是否有任何运行时API调用不可用于较早版本的Android? - Rahul
这几乎在所有的安卓版本上都会发生。由于APK是由Adobe Air生成的,因此我们无法运行lint。 - Noam
也许是您添加了Crashlytics后出现了崩溃,因此Crashlytics是问题的根源。 - Wrobel
请查看此 Stack Overflow 帖子:https://dev59.com/Apbfa4cB1Zd3GeqPuX7h - Sandeep R Venkatesh
3个回答

1
并非所有用户都遇到这个异常。显然,在运行时,对于那些用户,加载器中不存在这样的类。我的想法是,您正在使用一个库(例如lib.so,无论是您自己的本机代码还是第三方库),其本机代码不支持某种体系结构(例如MIPS或Intel),因此此类设备会收到异常。这是需要调查的问题。有不同体系结构的模拟器,因此您甚至可能不需要真正的硬件来测试是否是根本原因。

0
尝试在 build.gradle 中添加以下代码:
android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 26
        multiDexEnabled true
    }
    ...
}

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

在应用程序类中:

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

0

Crashlytics 不会立即更新。

只有用户再次打开应用程序后,该崩溃才会在 Crashlytics 中报告。

可能的情况

  1. 您的设备在崩溃后可能无法打开应用程序
  2. 可能在崩溃后被卸载

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接