Throwable().getStackTrace()[0].getLineNumber() 被 proguard 混淆

Throwable().getStackTrace()[0].getLineNumber() obfuscated by proguard

Proguard 之前:

Throwable().getStackTrace()[0].getLineNumber();

我得到了:

482

Proguard 后我得到:

41

这显然是错误的。

这里是解决这个问题的经过测试的规则:

-keep class java.lang.StackElement
-keepattributes StackTraceElement
-keepattributes SourceFile,LineNumberTable
-keepattributes Signature
-keepattributes InnerClasses,EnclosingMethod
-keepattributes getStackTrace

但是没用。有什么特定的规则可以让这段代码正常工作吗?

根据the manual,您需要这样做:

-renamesourcefileattribute SourceFile    
-keepattributes SourceFile,LineNumberTable

并且您需要使用 -printmapping 来保存映射,以便您可以解码混淆的堆栈跟踪。

我应该指出,对标准 class 库中的 classes 和方法的引用将始终保留,因为在加载代码时需要它们。因此这个“-keep”是多余的:

-keep class java.lang.StackElement

并且您还告诉 Proguard 保留名为 "StackTraceElement" 和 "getStackTrace" 的属性,它们不存在。记录了支持的属性列表 here

另请参阅:

  • 。问题是不同的(你不想保留方法名称!)但是接受的答案提到了上面的解决方案。