dexes文件中的endian_tag如何实际工作? Documentation表示
常量ENDIAN_CONSTANT用于指示。的字节序 找到它的文件。虽然标准.dex格式是 little-endian,实现可以选择执行字节交换。 是否应该遇到endian_tag为的标头 REVERSE_ENDIAN_CONSTANT而不是ENDIAN_CONSTANT,它会知道 该文件已从预期的表单进行字节交换。
建议如果有REVERSE_ENDIAN_CONSTANT
该文件应该使用big-endian。这是对的吗?此外 - 该文件的哪个部分应该使用这个big-endian - 包括header_item
s的整个文件?
答案 0 :(得分:2)
big-endian标志将应用于文件中任何位置的任何多字节值。您可以通过查看DexSwapVerify source来查看它适用的确切事项,{{3}}负责将所有多字节值从文件的字节顺序转换为主机的字节顺序。这样做是为了使VM或工具的其他部分在每次访问值时都不必交换。
大多数Android设备都是小端ARM或x86,因此交换操作是无操作。一些Android OS开发人员在早期使用PPC Mac,并且有一些大端设备(例如MIPS),因此交换代码很重要。
一条特别感兴趣的是:
if (pHeader->endianTag != kDexEndianConstant) {
ALOGE("Unexpected endian_tag: %#x", pHeader->endianTag);
return false;
}
注意它没有检查反向字节序常量 - 代码不希望找到一个大端的DEX文件。 “Raw”DEX文件应该是little-endian - 格式为它们提供了一种大端的方式,但是我希望大多数工具能够阻塞它们。
优化的DEX(.odex)文件以主机字节顺序存储,因此从.odex读取时会跳过字节交换步骤。优化的DEX文件只能在生成它们的系统上读取。