2015-08-24 52 views
0

我在我的應用程序中使用ProGuard,問題是當用戶向我的控制檯報告一些問題,並且由於「未知來源」而無法精確解碼。如何精確解碼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) 

那隻能說明發生錯誤時的片段名稱,但我也需要確切的線條和方法。

+1

當模糊處理時您是否保留行號,因爲堆棧跟蹤已經沒有這些信息? http://stackoverflow.com/questions/10158849/android-proguard-return-line-number –

+0

不,我沒有保留它。因此,將這些行(在您發送的鏈接中)添加到ProGuard中會將行號保存在堆棧跟蹤中? – Adam

+0

是的。它當然也會縮小收縮率,因爲這些信息不會被二進制混淆/刪除。 –

回答

0

你的問題其實有兩個部分。

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 

這當然會再次刪除某些信息,並會降低你的混淆。