2012-04-25 19 views
1

我感兴趣的是在编译后的类文件在dx转换为dex文件之前做一些修补。我看了一下官方Dalvik documentation,还有DEX format and Class format之间的比较。我无法找到关于实际转换过程,class-> dex的许多信息。 dx是否在转换之前首先验证Class文件?它是否简单地按照领域和方法按方法进行,将指令组合并成更紧凑的分组?任何洞察力将不胜感激。dx转换为dex是否包含原始类文件的验证?

谢谢。

+0

我知道使用脱机验证的唯一环境是JavaCard。有关dx的详细信息,我只需使用反编译器并查看dx JAR文件中存储的内容。 – Robert 2012-04-25 14:42:47

回答

2

我并不熟悉dx本身以及与dalvik字节码一样的转换过程,但我不记得看到任何对原始java字节码的验证,尽管显然它必须足够完整才能被解析/由dx理解。

没有关于我知道的转换过程的文档。它涉及将字节码转换为几个中间格式(ROP,SSA),并且包含一些用于有效寄存器分配的逻辑和一些中间格式的优化(我认为)。

有关转换过程的详细信息,最好的办法是看DX源本身(/达尔维克/ DX)

5

dx的运行方式,它通常没有足够的信息来办所有可能的验证,也没有写入这样做。特别是,部分验证与一个类中的代码如何引用其他类中的代码有关,并且在运行dx时,所讨论的“其他类”的代码可能实际上不可用。例如,您可以针对Android API级别6编译一些代码,生成.dex文件。稍后,当运行API级别为29的设备出现时,您可以尝试运行该.dex文件。只有当文件在系统上并准备运行时,系统才会具有执行验证所需的所有信息。此时,它可以检查.dex文件中的引用与系统上可用的内容,并接受(通过验证)或拒绝(验证失败)该文件。

作为一个简单的例子,也许.dex文件指的是在API级别6存在,但除去作为API级的29

但是要清楚,如@JesusFreke说,dx需要一个类或方法能够解析.class档案足以能够完成其翻译工作。如果它在该层出现问题,则会报告为翻译失败,这在上下文中与验证错误相当,尽管通常不会如此表述。

即使不顾API演化的可能性,可以采取.class,将无法核实,在将其转化为.dex文件(的一部分)成功,然后观察到.dex文件未能校验。

我希望这有助于!

+0

嘿,这是一个danfuzz! – JesusFreke 2012-04-26 17:02:52

相关问题