Adam
Adam

Reputation: 2192

How to decode ProGuard's obfuscated code precisely?

I am using ProGuard in my application and problem is when users report some problem to my console and I can't decode it precisely because of "Unknown source".

Here is example of 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)

Then I am using this code to decode it:

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

And here is output:

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)

It only shows name of Fragment when error occurred, but I also need exact line and method.

Upvotes: 1

Views: 4618

Answers (1)

ben-efiz
ben-efiz

Reputation: 813

Your question has actually two parts.

1) Why are you missing the line information?

You are removing the line information during obfuscation. You need the following rules in your proguard.cfg

-renamesourcefileattribute MyApplication
-keepattributes SourceFile,LineNumberTable

Find details for retracing line numbers here: http://proguard.sourceforge.net/manual/retrace/examples.html#with

2) Why is it missing some method/class name, in your example

com.my.package.MyFragment$10.void

This is because $10 is most likely an anonymous class declaration which will be treated differently during compiling and subsequent obfuscation. First easy solution is of course to get rid of the anonymous declaration and declare it somewhere. Another solution would be to add the following line again to your proguard.cfg

-keepattributes EnclosingMethod

This of course will again not remove some information and will reduce your obfuscation.

Upvotes: 2

Related Questions