如何使用Android Developer Console崩溃报告查找崩溃源?

时间:2018-05-16 07:49:09

标签: android crash-reports callstack

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

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

有三个主要问题:

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

    // 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语句的含义是什么?这是否意味着,每种方法都会发生异常(应该如何实现)?
    • 为什么去混淆日志中没有行号?给定的方法很长,没有任何进一步的信息,我不知道究竟是什么导致了这个问题。模糊处理中的行号似乎指向随机行,它们不以任何方式链接到实际代码。

    所以主要问题是:

    如何使用日志中的信息查找崩溃的来源?

2 个答案:

答案 0 :(得分:1)

您需要在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文件中看到它)。这就是堆栈跟踪知道方法B中方法A 中发生错误的原因,但并不确切知道哪一个错误。

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

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

这些选项会增加你的apk尺寸,但它是完全值得的。这让我很难分析我的堆栈痕迹。

答案 1 :(得分:0)

最好使用Fabrics。它会给出崩溃报告以及行号。