java - 将 Dalvik 反编译为 Java,为什么会有这么多不一致?

标签 java android bytecode decompiling dalvik

我在一个应用程序的dex文件上使用了dex2jar和JD-gui,虽然在代码的几个部分,它没有意义并且在反编译方面存在错误。

虽然当我在 dex 文件上使用 backsmali 时,代码是正确的,但我更愿意阅读 Java 代码而不是 Smali 来理解一个大应用程序是如何工作的。

首先,为什么Java代码中有这么多的不一致?这是 dex2jar 或 JD-gui 的问题吗?还有其他选择吗?

最佳答案

即使从 .class 文件到 .java 文件,反编译通常也不那么完美。

一方面是因为编译并不代表 .class 文件中源文件的所有信息这一简单事实。空格和注释是 .class 文件中未表示的最明显的信息示例。局部变量名称也经常被遗漏,并且根据您的编译标志,甚至参数名称也可能丢失。

另一方面,反编译器的市场似乎相当有限,缺乏竞争导致反编译器无法像可能那样工作。例如,Java 编译器的每个新版本都可能生成新代码,这些代码需要对反编译器进行等效更新,以检测新模式并从中生成适当的 Java 源代码。缺少这样的更新,反编译器必然会要么失败并打印字节码反汇编,要么产生看起来很奇怪的结构,它们做同样的事情但永远不会被编写一个人。

当您添加另一个编译级别(Java 字节代码 -> Dalvik 字节代码)时,它只会变得更糟。

除非您能给出一个具体的例子来说明什么样的您的意思是很难给出更好的答案。

关于java - 将 Dalvik 反编译为 Java,为什么会有这么多不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7329933/

相关文章:

java - Byte Buddy - 带 ByteBuddyAgent 的 HotSwap

java - 字节码编译错误

java - 如何使用 JNI 或 JNA 读取窗口标题?

JavaFX 虚拟键盘

java - 更新角色需要正则表达式

android - 如何获取默认的音频流类型?

kotlin - Kotlin- bool 值如何?如果表达式对字节码有效

java - 如何添加数据而不覆盖现有数据?

java - 将返回值限制在两个值之间的最短代码

android - 如何传递 Intent 但不立即开始 Activity