我感兴趣的是在编译的Class文件被dx转换为dex文件之前做一些修补。我看了一下官方Dalvik documentation以及DEX format and Class format之间的比较。我找不到有关实际转换过程,class-> dex的更多信息。 dx首先在转换之前验证Class文件吗?它是简单地按字段和方法逐个进行,将指令组合并到更紧凑的分组中吗?任何见解都将不胜感激。
感谢。
答案 0 :(得分:5)
运行dx
的方式,它通常没有足够的信息来执行所有可能的验证,也没有写入这样做。特别是,验证的一部分与一个类中的代码如何引用其他类中的代码有关,并且当运行dx
时,所讨论的“其他类”的代码可能实际上不可用。例如,您可以针对Android API级别6编译一些代码,生成.dex
文件。稍后,当运行API级别29的设备出现时,您可以尝试运行该.dex
文件。只有当文件在系统上并准备运行时,系统才会拥有执行验证所需的所有信息。此时,它可以检查.dex
文件中的引用与系统上可用的内容,并接受(通过验证)或拒绝(验证失败)该文件。
作为一个简短示例,.dex
文件可能是指API级别6中存在但从API级别29开始删除的类或方法。
但要明确,正如@JesusFreke所说,dx
需要能够解析.class
个文件,足以完成翻译工作。如果它在该层遇到问题,它将报告为翻译失败,在上下文中,它大致等同于验证错误,尽管通常不会这样说。
即使忽略API发展的可能性,也可以采用无法验证的.class
,成功将其转换为({1}}文件的一部分,然后注意.dex
文件无法验证。
我希望这有帮助!
答案 1 :(得分:2)
我对dx本身以及与dalvik字节码的转换过程并不熟悉,但我不记得看到原始java字节码的任何验证,尽管显然它必须足够好以便解析/由dx理解。
我没有关于转换过程的文档。它涉及将字节码转换为几种中间格式(ROP,SSA),并包括一些用于有效寄存器分配的逻辑和一些中间形式的优化(我认为)。
有关转换过程的更多信息,最好的办法是查看dx源本身(/ dalvik / dx)