dex文件的endian_tag

时间:2016-05-19 11:47:43

标签: android dalvik dex

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的整个文件?

1 个答案:

答案 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文件只能在生成它们的系统上读取。