我在我的应用程序中使用ProGuard,问题是当用户向我的控制台报告一些问题时,由于"未知来源",我无法准确解码。
下面是stacktrace的例子:
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的名称,但我也需要确切的行和方法
你的问题实际上有两个部分。
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很可能是一个匿名类声明,在编译和随后的混淆过程中会被不同地对待。第一个简单的解决方案当然是摆脱匿名声明,并在某处声明它。另一个解决方案是再次将以下行添加到proguard.cfg
中-keepattributes EnclosingMethod
这当然会再次不删除一些信息,并将减少您的混淆