dx转换为dex是否包括验证原始类文件?

Cha*_*Kut 1 android class dalvik dex

我感兴趣的是在编译的Class文件被dx转换为dex文件之前做一些修补.我看了一下官方的Dalvik文档以及DEX格式和Class格式之间的比较.我找不到关于实际转换过程的很多信息,class-> dex.dx首先在转换之前验证Class文件吗?它是简单地按字段和方法逐个进行,将指令组合并到更紧凑的分组中吗?任何见解将不胜感激.

谢谢.

dan*_*uzz 5

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

作为一个简短的示例,该.dex文件可能是指API级别6中存在但在API级别29之后被删除的类或方法.

但要明确的是,正如@JesusFreke所说,dx需要能够解析.class足够的文件才能完成翻译工作.如果它在该层遇到问题,它将报告为翻译失败,在上下文中,它大约等同于验证错误,尽管通常不是这样说的.

即使忽略API发展的可能性,也可以采用.class不能验证,成功将其转换为(部分).dex文件,然后观察.dex文件无法验证的情况.

我希望这有帮助!