如何精确解码ProGuard的混淆码?
How to decode ProGuard's obfuscated code precisely?
我在我的应用程序中使用 ProGuard,问题是当用户向我的控制台报告一些问题时我无法准确解码它,因为 "Unknown source"。
这里是堆栈跟踪的例子:
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.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 access0(com.stericson.RootTools.execution.Shell)
at com.stericson.RootTools.execution.Shell.void run()(Unknown Source)
at java.lang.Thread.run(Thread.java:856)
出现错误时只显示Fragment的名称,但我还需要确切的行和方法。
你的问题实际上有两部分。
1) 为什么你缺少线路信息?
您正在混淆过程中删除线路信息。您的 proguard.cfg
中需要以下规则
-renamesourcefileattribute MyApplication
-keepattributes SourceFile,LineNumberTable
在此处查找有关追溯行号的详细信息:http://proguard.sourceforge.net/manual/retrace/examples.html#with
2) 为什么缺少一些 method/class 名称,在您的示例中
com.my.package.MyFragment.void
这是因为 $10 很可能是一个 anonymous class declaration,在编译和随后的混淆过程中将被区别对待。第一个简单的解决方案当然是摆脱匿名声明并在某处声明。另一种解决方案是将以下行再次添加到您的 proguard.cfg
-keepattributes EnclosingMethod
这当然会再次不会删除一些信息并且会减少您的混淆。
我在我的应用程序中使用 ProGuard,问题是当用户向我的控制台报告一些问题时我无法准确解码它,因为 "Unknown source"。
这里是堆栈跟踪的例子:
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.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 access0(com.stericson.RootTools.execution.Shell)
at com.stericson.RootTools.execution.Shell.void run()(Unknown Source)
at java.lang.Thread.run(Thread.java:856)
出现错误时只显示Fragment的名称,但我还需要确切的行和方法。
你的问题实际上有两部分。
1) 为什么你缺少线路信息?
您正在混淆过程中删除线路信息。您的 proguard.cfg
中需要以下规则-renamesourcefileattribute MyApplication
-keepattributes SourceFile,LineNumberTable
在此处查找有关追溯行号的详细信息:http://proguard.sourceforge.net/manual/retrace/examples.html#with
2) 为什么缺少一些 method/class 名称,在您的示例中
com.my.package.MyFragment.void
这是因为 $10 很可能是一个 anonymous class declaration,在编译和随后的混淆过程中将被区别对待。第一个简单的解决方案当然是摆脱匿名声明并在某处声明。另一种解决方案是将以下行再次添加到您的 proguard.cfg
-keepattributes EnclosingMethod
这当然会再次不会删除一些信息并且会减少您的混淆。