将Dalvik反编译为Java,为什么会有如此多的不一致之处?

我在应用程序的dex文件上使用了dex2jar和JD-gui,尽管在代码的某些部分,它没有意义,并且在反编译方面存在错误.

尽管当我在dex文件上使用backsmali时,代码是正确的,但我更愿意阅读Java代码而不是Smali来理解大型应用程序的工作原理.

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

解决方法:

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

一方面是由于一个简单的事实,即编译并不代表.class文件中源文件中的所有信息.空白和注释是.class文件中未表示的最明显的信息示例.局部变量名称也经常被忽略,根据您的编译标志,甚至参数名称也可能丢失.

另一方面,反编译器的市场似乎非常有限,缺乏竞争会导致反编译器无法正常运行.例如,Java编译器的每个新发行版都可能产生新代码,需要对反编译器进行等效更新才能检测到新模式并从中产生合适的Java源代码.缺少这样的更新,反编译器必然会失败并打印字节码反汇编,或者生成看起来很奇怪的构造,它们执行相同的操作,但永远不会被人类编写.

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

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

上一篇:java – 从错误中恢复的最佳策略是什么 – 忽略发生错误的记录


下一篇:深入理解JAVA虚拟机原理之Dalvik虚拟机(三)