【问题标题】:How to find crash source using Android Developer Console crash report?如何使用 Android Developer Console 崩溃报告查找崩溃源?
【发布时间】:2018-10-26 04:04:28
【问题描述】:

自从我在 Google Play 商店中发布了我的应用的新版本后,我在 Android 开发者控制台中收到了崩溃报告。

我在发布新版本后立即上传了 ProGuard mappings.txt。因此,所有日志都不会混淆(所有类名和方法都以明文形式出现)。但是我仍然不确定阅读它们是否热。

主要存在三个问题:

  1. 报告只显示崩溃方法,但没有行号。所以我不知道方法的哪一部分导致了崩溃。
  2. 一些崩溃报告显示了使用OR 的不同方法。这是什么意思?
  3. 并非所有报告都经过去混淆处理。有些仍然显示为匿名类和方法名称

示例:

// Crash Log with is NOT obfuscated
Caused by: java.lang.NullPointerException: 
1:  at com.example.MyApp.Path.To.Package.MyClass.myMethod1 (MyClass.java)  // <-- No Line Numbers...
    or                     .myMethod2 (MyClass.java)    // <-- WHAT does this OR mean???
    or                     .myMethod3 (MyClass.java)
2:  at com.example.MyApp.Path.To.Package.MyClass.onCreateView (MyClass.java)
3:  at android.support.v4.app.Fragment.performCreateView (Fragment.java)
4:  at android.support.v4.app.FragmentManagerImpl.access$500 (FragmentManagerImpl.java)
    or                     .access$600 (FragmentManagerImpl.java)
    or                     .addFragment (FragmentManagerImpl.java)
    or                     .allocBackStackIndex (FragmentManagerImpl.java)
    or                     .animateRemoveFragment (FragmentManagerImpl.java)
    ...

5:  at android.support.v4.app.FragmentManagerImpl.access$500 (FragmentManagerImpl.java)
...


// Other crash seems to show the same problem but is still obfuscated
Caused by: java.lang.NullPointerException: 
1:  at com.example.MyApp.Path.To.Package.MyClass.a (MyClass.java:89)  // <-- Line numbers available here...
2:  at com.example.MyApp.Path.To.Package.MyClass.b (MyClass.java:40)
3:  at android.support.v4.app.Fragment.performCreateView (Fragment.java)
... // Same call stack as above  

问题:

  • 为什么有些日志经过去混淆处理而其他(似乎显示相同的错误)没有?上传映射文件后创建的两个日志。没有映射文件的旧版本的日志显示明确的“日志被混淆”消息
  • 调用堆栈中OR 语句的含义是什么?这是否意味着,这些方法中的每一个都发生了异常(这应该怎么可能)?
  • 为什么去混淆的日志中没有行号?给定的方法很长,没有任何进一步的信息,我不知道究竟是什么导致了这个问题。混淆后的行号似乎指向随机行,这些行与实际代码没有任何关联。

所以主要问题是:

如何使用日志中的信息找到崩溃的根源?

【问题讨论】:

    标签: android crash-reports callstack


    【解决方案1】:

    最好改用织物。它会给出崩溃报告以及行号。

    【讨论】:

    • 虽然我可能会在未来的版本中尝试一下,但这并不是当前问题的真正解决方案,是吗?
    【解决方案2】:

    您需要在 Proguard 配置中添加以下选项:

    # This option forces Proguard to use different obfuscated names
    # for different members. It avoids the 'or' stack traces.
    -useuniqueclassmembernames
    
    # These options produce useful stacktraces preserving line numbers
    -renamesourcefileattribute SourceFile
    -keepattributes SourceFile,LineNumberTable
    

    没有-useuniqueclassmembernames,Proguard 可以为同一类的不同方法分配相同的混淆名称(您可以在 mapping.txt 文件中看到它)。这就是为什么堆栈跟踪知道错误发生在方法 A 中的方法 B,但不知道具体是哪一个。

    使用-useuniqueclassmembernames 选项,所有经过混淆的名称都会不同,并且不会再有堆栈跟踪。有关此here 的更多信息。

    除此之外,Proguard 不会保留有关行号的信息,除非我们按照指示使用 -renamesourcefileattribute-keepattributes 选项。有关此here 的更多信息。

    这些选项会稍微增加您的 apk 大小,但这是完全值得的。这让我在分析堆栈跟踪时省去了很多麻烦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多