如何准确解码 ProGuard 的混淆代码?

Posted

技术标签:

【中文标题】如何准确解码 ProGuard 的混淆代码?【英文标题】:How to decode ProGuard's obfuscated code precisely? 【发布时间】:2015-11-17 21:02:18 【问题描述】:

我在我的应用程序中使用 ProGuard,问题是当用户向我的控制台报告一些问题并且由于“未知来源”而我无法准确解码时。

这是堆栈跟踪的示例:

java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
at com.my.package.j.a(Unknown Source)
at com.a.a.c.c.j(Unknown Source)
at com.a.a.c.c.b(Unknown Source)
at com.a.a.c.e.run(Unknown Source)
at java.lang.Thread.run(Thread.java:856)

那我就用这段代码来解码:

./retrace.sh -verbose mapping.txt stacktrace.txt > out.txt

这是输出:

java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
at com.my.package.MyFragment$10.void output(int,java.lang.String)(Unknown Source)
at com.stericson.RootTools.execution.Shell.void readOutput()(Unknown Source)
at com.stericson.RootTools.execution.Shell.void closeCustomShell()(Unknown Source)
                                           com.stericson.RootTools.execution.Shell startShell(int)
                                           void access$200(com.stericson.RootTools.execution.Shell)
at com.stericson.RootTools.execution.Shell$2.void run()(Unknown Source)
at java.lang.Thread.run(Thread.java:856)

发生错误时只显示Fragment的名称,但我还需要确切的行和方法。

【问题讨论】:

您是否在混淆时保留行号,因为堆栈跟踪已经没有此信息? ***.com/questions/10158849/… 不,我不保留它。那么将这些行(在您发送的链接中)添加到 ProGuard 会将行号保留在堆栈跟踪中吗? 会的。当然,它也会稍微降低收缩率,因为这些信息不会被混淆/从二进制文件中删除。 【参考方案1】:

你的问题实际上有两个部分。

1) 为什么缺少线路信息?

您在混淆过程中删除了行信息。您的 proguard.cfg 中需要以下规则

-renamesourcefileattribute MyApplication
-keepattributes SourceFile,LineNumberTable

在此处查找有关回溯行号的详细信息:http://proguard.sourceforge.net/manual/retrace/examples.html#with

2)为什么在您的示例中缺少一些方法/类名

com.my.package.MyFragment$10.void

这是因为 $10 很可能是 anonymous class declaration,在编译和随后的混淆过程中会被区别对待。第一个简单的解决方案当然是摆脱匿名声明并在某处声明它。另一种解决方案是将以下行再次添加到您的 proguard.cfg

-keepattributes EnclosingMethod

这当然会再次不会删除某些信息,并且会减少您的混淆。

【讨论】:

以上是关于如何准确解码 ProGuard 的混淆代码?的主要内容,如果未能解决你的问题,请参考以下文章

Android proguard代码混淆

ProGuard 代码混淆

原创解决Maven ProGuard不混淆局部变量的问题,以及如何使用混淆好的包

安卓编程 如何进行代码混淆

Proguard 不会混淆 android 中的 strings.xml

构建配置 ProGuard Shrink 混淆和压缩