gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 09:26:17 25 4
gpt4 key购买 nike

自从我在 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 语句是什么意思?这是否意味着这些方法中的每一个都发生了异常(这怎么可能)?
  • 为什么去混淆后的日志中没有行号?给定的方法很长,没有任何进一步的信息,我不知道到底是什么导致了这个问题。混淆后的行号似乎指向随机行,这些行未以任何方式链接到真实代码。

所以主要问题是:

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

最佳答案

您需要将以下选项添加到您的 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 中,但不知 Prop 体是哪一个。

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

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

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

关于android - 如何使用 Android Developer Console 崩溃报告查找崩溃源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50365149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com