首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何准确地解码ProGuard的模糊代码?

如何准确地解码ProGuard的模糊代码?
EN

Stack Overflow用户
提问于 2015-08-24 12:26:00
回答 1查看 4K关注 0票数 1

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

下面是堆栈跟踪的示例:

代码语言:javascript
复制
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)

然后我使用这段代码来解码它:

代码语言:javascript
复制
./retrace.sh -verbose mapping.txt stacktrace.txt > out.txt

这是输出:

代码语言:javascript
复制
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)

它只显示错误发生时的片段名,但我也需要精确的行和方法.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-24 12:56:43

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

( 1)你为什么漏掉了线路信息?

您将在混淆期间删除行信息。您需要在proguard.cfg中使用以下规则

代码语言:javascript
复制
-renamesourcefileattribute MyApplication
-keepattributes SourceFile,LineNumberTable

在这里找到关于回溯行号的详细信息:http://proguard.sourceforge.net/manual/retrace/examples.html#with

2)在您的示例中,为什么缺少某种方法/类名?

代码语言:javascript
复制
com.my.package.MyFragment$10.void

这是因为$10很可能是一个匿名类声明,它在编译和随后的混淆过程中将被不同的对待。首先,简单的解决方案当然是去掉匿名声明,并在某个地方声明它。另一种解决方案是再次向proguard.cfg中添加以下行

代码语言:javascript
复制
-keepattributes EnclosingMethod

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32182300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档