我遇到的问题是,我的开发者控制台的堆栈跟踪与代码不匹配。行号显着关闭,并且必须在跟踪中的方法将不会存在于控制台的跟踪中。例如(简化的控制台跟踪):
at getBitmapSize
at getBitmapBytes
at onActivityResult
但是在代码中它必须采用这条路径:
onActivitResult -> handleSaveImage -> getBitmapBytes -> getBitmapSize
这段代码多年来没有变化,因此不需要使用错误的mapping.txt。以某种方式应用proguard是删除应用程序中的结构。那可能吗?它不会映射回来吗?
在转向proguard之前,我从未在堆栈跟踪中看到丢失方法。
关于让行号匹配,还有什么我应该知道的吗?
我已经设定:
-keepattributes SourceFile,LineNumberTable
几乎可以工作。他们只是没有正确排队。
我设置了一个测试,将NPE放在可预测的内联点上。
(优化) logcat错误具有正确的行号,并且仅为了清楚而分开的方法明显是行间的。通过正确的行号,一切都更加明显。
(未优化) 获得相同的堆栈跟踪,除了跟踪中的其他方法。行号再次正确。
我不明白为什么开发者控制台跟踪的行号错误,但这就是它难以理解的原因。它们不仅在一个文件中关闭,而且在所有文件中都关闭,因此它只是一个令人困惑的混乱,尤其是在您有多个异常处理(如i / o)的任何地方。
我将未经优化的应用程序提交到Play商店,现在堆栈跟踪排队。当你依赖Play堆栈跟踪时,我建议不要在复杂的应用程序中使用优化。
答案 0 :(得分:4)
启用Proguard优化后,它可能会内联小方法。这可以解释为什么堆栈跟踪中似乎缺少步骤。尝试在Proguard配置中禁用优化。有关如何为Android配置优化的指导,请参阅Android Proguard does not inline。
如果您使用的是Gradle构建系统,则build.gradle
中会有一行包含以下内容:
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.txt'
要尝试禁用优化,请将其更改为
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'