Google Play 控制台崩溃报告 - 多个 OR
Posted
技术标签:
【中文标题】Google Play 控制台崩溃报告 - 多个 OR【英文标题】:Google Play Console Crash Reports - multiple ORs 【发布时间】:2018-07-25 08:07:36 【问题描述】:为什么我的生产应用程序崩溃报告的 Google Play 控制台(位于“android Vitals”/“ANR 和崩溃”,然后选择任何崩溃以查看堆栈跟踪)包含很多 OR在堆栈跟踪中?
这是什么意思?这 12 种方法中的哪一种实际上导致了崩溃?为什么报告如此不明确?
有没有办法获得准确的方法名称,最好是报告中的行号? (我在“反混淆文件”下添加了映射文件)。
【问题讨论】:
我猜你可能正在使用多个mapping.txt
文件。不过我不确定。
未启用 proguard 可能是某种问题。您是否尝试在启用 proguard 的情况下产生错误?注意 minify 和 proguard 是不同的
我不确定。 minifyEnabled 为真(在 gradle 中)。我应该在哪里更改 proguard 设置?
minifyEnabled true 意味着您的代码将被优化和缩小。通过在 gradle 中提及 proguard 规则来使用 proguard 有助于混淆代码。
【参考方案1】:
原因是您正在使用 Proguard 来缩小和混淆您的代码(到目前为止一切都很好),并且 Proguard 尽可能多地重用相同的方法名称(即,只要方法的签名不同)尽量减少它必须使用的字母数量。所以缩小的代码很可能在每个类中包含十几个名称为“a”的方法,而堆栈跟踪只给你方法名称,而不是它的签名,所以很遗憾不可能知道十几个“a”方法中的哪一个正在被调用,因此反混淆工具为您提供了所有可能性。
您可以自定义 Proguard 配置以避免如此多的冲突,从而使您更容易调试,但这将以您的应用程序大小为代价。
编辑:使用 -useuniqueclassmembernames
标志来避免这些 OR。您可以查看ProGuard manual了解更多详情。
【讨论】:
您能否提供任何信息/说明如何解决此问题(即保留 proGuard 但摆脱 OR) - 这样我们就可以看到崩溃发生的确切位置。理想情况下也有行号 编辑了我的回复以回答您的问题。关于行号,我认为标志是-keepattributes SourceFile,LineNumberTable
更多信息可以在here 找到——搜索“产生有用的混淆堆栈跟踪”。希望有帮助:)【参考方案2】:
前段时间我也有同样的问题:
Strange stacktrace reported by Google Play Console。
在我的例子中,我注意到每个组中只有一个函数可能是正确的,因为其他函数没有在“上面”函数中调用。
我认为这是一种针对逆向工程的保护方法。
【讨论】:
以上是关于Google Play 控制台崩溃报告 - 多个 OR的主要内容,如果未能解决你的问题,请参考以下文章