classnotfound 崩溃未出现在 crashlytics 中,但出现在 google play 控制台中

Posted

技术标签:

【中文标题】classnotfound 崩溃未出现在 crashlytics 中,但出现在 google play 控制台中【英文标题】:classnotfound crashes not showing up in crashlytics, but in google play console 【发布时间】:2018-08-27 06:37:21 【问题描述】:

我们正在尝试调试发生在某些用户身上的崩溃,但无法确定它到底是什么。

在 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)并且它们都在那里。

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

有没有办法查看找不到的类名?这些错误不会出现在 crashlytics 上,而且我们无法在我们拥有的任何设备/模拟器上重现它。

谢谢!

编辑:部分解决

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

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

【问题讨论】:

您好,您能否指定出现此崩溃的 Android 操作系统版本?您是否在您的应用程序上运行了“lint”,以便它可以判断是否有任何运行时 api 调用在早期版本的 android 上不可用? 这发生在几乎所有的安卓版本上。我们无法运行 lint,因为 APK 是由 Adob​​e Air 生成的。 也许当您添加 Crashlytics 时它开始崩溃,因此 Crashlytics 是问题的根源 查看此 SO 帖子:***.com/questions/36881299/… 【参考方案1】:

因此,并非所有用户都会遇到此异常。显然,在运行时,对于那些用户来说,加载器不知道这样的类。我的想法是您正在使用一个库(如 lib.so,您自己的本机代码或第 3 方库),其本机代码不支持某种架构(如 MIPS 或英特尔),因此此类设备会出现异常.只是要调查的东西。有针对不同架构的模拟器,因此您甚至可能不需要真正的硬件来测试这是否是根本原因。

【讨论】:

【参考方案2】:

Crashlytics 不会立即更新。

一旦用户在崩溃后再次打开应用,该崩溃将在 Crashlytics 中报告。

可能的情况

    崩溃后您的崩溃设备可能无法打开应用 崩溃后可能会被卸载

【讨论】:

【参考方案3】:

在 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);
  

【讨论】:

以上是关于classnotfound 崩溃未出现在 crashlytics 中,但出现在 google play 控制台中的主要内容,如果未能解决你的问题,请参考以下文章

ClassNotFound:带有支持库 26.0.2 - 27.0.0 的 android.view.ViewStructure

在小部件中设置 Firebase 崩溃用户标识符的最佳方法是啥?

Android - 关于使用 jdbc 连接到 MSSQL 的 classnotfound

当 Google Play 控制台设备目录中未显示特定设备品牌/型号时,如何排除它?

Spring Security:未找到 WebSecurityConfigurerAdapter.class

Firebase Crashlytics 未报告崩溃