2011-09-07 35 views
3

我在應用程序的dex文件中使用了dex2jar和JD-gui,雖然在代碼的幾個部分中,它沒有任何意義,並且在反編譯方面存在錯誤。將Dalvik反編譯爲Java,爲什麼有這麼多的不一致?

儘管當我在dex文件上使用了backsmali時,代碼是正確的,但我更願意閱讀Java代碼,而不是Smali來理解大型應用程序的工作原理。

首先,爲什麼Java代碼中存在如此多的不一致?這是dex2jar還是JD-gui的問題?任何其他的選擇?

回答

4

即使從.class文件轉到.java文件,反編譯通常也不太完善。

一方面來自簡單的事實,即編譯並不代表.class文件中源文件的所有信息。空白和註釋是.class文件中未顯示的最明顯的信息示例。局部變量名通常也被忽略,並且取決於編譯標誌,甚至參數名稱可能會丟失。

另一方面,反編譯器的市場似乎相當有限,而缺乏競爭導致反編譯器不能很好地工作,可能可能。例如,Java編譯器的每個新版本都可能產生新代碼,這些代碼需要對反編譯器進行等效更新才能檢測新模式並從中生成適當的Java源代碼。缺少這樣的更新,反編譯器被綁定到或者失敗,並打印字節碼反彙編產生奇怪的結構,做同樣的事情,但永遠不會被人寫。

而當你添加另一級別的編譯(Java字節碼 - > Dalvik字節碼),那麼它只會變得更糟。

除非你能給出一個具體例如什麼樣你的意思不一致,很難給出一個更好的答案。