将Dalvik反编译为Java时,为什么会出现这么多不一致性?

3
我使用了 dex2jar 和 JD-gui 对一个应用程序的dex文件进行了翻译,但是在代码的几个部分中没有意义,并且存在反编译方面的错误。
虽然当我对dex文件使用 backsmali 进行翻译时,代码是正确的,但是我更喜欢阅读Java代码而不是Smali代码来了解一个大型应用程序的工作原理。
首先,为什么Java代码中存在这么多不一致之处?这是 dex2jar 或 JD-gui 的问题吗?还有其他的替代方案吗?
1个回答

4

即使将.class文件转换为.java文件,反编译通常也不是完美的。

一方面,这是因为编译并没有在.class文件中表示源文件中的所有信息。空格和注释是在.class文件中未表示的信息的最明显的例子。本地变量名称也经常被省略,在编译标志取决的情况下,甚至可能会丢失参数名。

另一方面,反汇编市场似乎非常有限,缺乏竞争导致反编译器的工作效果不如可能想象的那么好。例如,每个新版本的Java编译器都可以生成新代码,需要相应更新反编译器以检测新模式并生成适当的Java源代码。如果缺乏此类更新,反编译器就只能像打印字节码反汇编一样失败或者产生怪异的结构来执行相同的操作,但这些结构从未由人类编写过。

而且,当你添加另一个编译级别(Java字节码 -> Dalvik字节码)时,情况只会更糟。

除非您能给出哪种不一致性的具体示例,否则很难给出更好的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接