Proguard 不保留堆栈跟踪中的行号和方法名称

Posted

技术标签:

【中文标题】Proguard 不保留堆栈跟踪中的行号和方法名称【英文标题】:Proguard doesnt preserve the line numbers and method names in stacktrace 【发布时间】:2017-01-12 08:07:19 【问题描述】:

这里有几行来自 proguard-rules.pro

 -keepattributes *Annotation*
 -keepattributes Signature
 -keepattributes InnerClasses,EnclosingMethod
 -renamesourcefileattribute SourceFile
 -keepattributes SourceFile,LineNumberTable
 -keep public class * extends java.lang.Exception
 -dontwarn org.apache.http.**

Logcat 输出(错误行号列为 1133,而我的源文件长 100 行)

09-04 16:11:46.698 3827-5280/com.XX.main E/androidRuntime: FATAL EXCEPTION: IntentService[ActivityRecognizedTracker]
Process: com.XX.main, PID: 3827
java.lang.NullPointerException: Attempt to read from field 'double com.XX.trips.Trip.a' on a null object reference
at com.XX.ActivityRecognizedTracker.onHandleIntent(SourceFile:1133)

我保留了行号和源文件属性,但堆栈跟踪仍然是模糊的。我做错了什么?

【问题讨论】:

【参考方案1】:

AFAIK 无法混淆代码并拥有原始堆栈跟踪。所以如果你想在stacktrace中看到原始的方法和类名,你必须添加-dontobfuscate规则。

但您实际上并不需要原始堆栈跟踪。

您正在使用-keepattributes SourceFile,LineNumberTable,这使您能够unambiguously retrace the stacktrace。只是不要忘记保留生成的mapping.txt 文件。

此外,如果您删除 -renamesourcefileattribute SourceFile,您将在括号中看到原始文件名。行号已经存在,因此您应该能够找出异常实际发生的位置。

【讨论】:

谢谢!你帮我做的正是我需要的。

以上是关于Proguard 不保留堆栈跟踪中的行号和方法名称的主要内容,如果未能解决你的问题,请参考以下文章

UWP 应用的堆栈跟踪中的行号

在发布模式下显示 .NET 程序集的堆栈跟踪中的行号

Kotlin 代码堆栈跟踪显示 Java 行号

使用 ProGuard 值得吗?

为啥我的异常堆栈跟踪总是指向最后一个方法行?

如何使用带有行号信息的 gcc 获取 C++ 的堆栈跟踪?