我感兴趣的是在编译后的类文件在dx转换为dex文件之前做一些修补。我看了一下官方Dalvik documentation,还有DEX format and Class format之间的比较。我无法找到关于实际转换过程,class-> dex的许多信息。 dx是否在转换之前首先验证Class文件?它是否简单地按照领域和方法按方法进行,将指令组合并成更紧凑的分组?任何洞察力将不胜感激。dx转换为dex是否包含原始类文件的验证?
谢谢。
我感兴趣的是在编译后的类文件在dx转换为dex文件之前做一些修补。我看了一下官方Dalvik documentation,还有DEX format and Class format之间的比较。我无法找到关于实际转换过程,class-> dex的许多信息。 dx是否在转换之前首先验证Class文件?它是否简单地按照领域和方法按方法进行,将指令组合并成更紧凑的分组?任何洞察力将不胜感激。dx转换为dex是否包含原始类文件的验证?
谢谢。
我并不熟悉dx本身以及与dalvik字节码一样的转换过程,但我不记得看到任何对原始java字节码的验证,尽管显然它必须足够完整才能被解析/由dx理解。
没有关于我知道的转换过程的文档。它涉及将字节码转换为几个中间格式(ROP,SSA),并且包含一些用于有效寄存器分配的逻辑和一些中间格式的优化(我认为)。
有关转换过程的详细信息,最好的办法是看DX源本身(/达尔维克/ DX)
是dx
的运行方式,它通常没有足够的信息来办所有可能的验证,也没有写入这样做。特别是,部分验证与一个类中的代码如何引用其他类中的代码有关,并且在运行dx
时,所讨论的“其他类”的代码可能实际上不可用。例如,您可以针对Android API级别6编译一些代码,生成.dex
文件。稍后,当运行API级别为29的设备出现时,您可以尝试运行该.dex
文件。只有当文件在系统上并准备运行时,系统才会具有执行验证所需的所有信息。此时,它可以检查.dex
文件中的引用与系统上可用的内容,并接受(通过验证)或拒绝(验证失败)该文件。
作为一个简单的例子,也许.dex
文件指的是在API级别6存在,但除去作为API级的29
但是要清楚,如@JesusFreke说,dx
需要一个类或方法能够解析.class
档案足以能够完成其翻译工作。如果它在该层出现问题,则会报告为翻译失败,这在上下文中与验证错误相当,尽管通常不会如此表述。
即使不顾API演化的可能性,可以采取.class
,将无法核实,在将其转化为.dex
文件(的一部分)成功,然后观察到.dex
文件未能校验。
我希望这有助于!
嘿,这是一个danfuzz! – JesusFreke 2012-04-26 17:02:52
我知道使用脱机验证的唯一环境是JavaCard。有关dx的详细信息,我只需使用反编译器并查看dx JAR文件中存储的内容。 – Robert 2012-04-25 14:42:47