首页 文章

ZipAlign验证

提问于
浏览
9

在Android中,ZipAlign用于对齐4字节边界上的资源以加速资源加载:

Android中的资源处理代码可以通过内存映射它们在4字节边界上对齐时有效地访问资源 . 但是对于未对齐的资源(即当zipalign尚未在apk上运行时),它必须回退到显式读取它们 - 这更慢并且消耗额外的内存 .

运行该工具后,可以使用该命令验证对齐 .

zipalign -c -v 4 application.apk

这会生成一个报告并告知是否存在错误 . 在我的例子中,这个报告表明没有对齐错误,但是第一个数字,我认为它是最终APK中资源的位置,似乎表明某些资源没有在4个字节边界上对齐 .

以下是本报告的开头:

Verifying alignment of APP-signed-aligned.apk (4)...
      50 META-INF/MANIFEST.MF (OK - compressed)
   24245 META-INF/KEYS.SF (OK - compressed)
   49830 META-INF/KEYS.DSA (OK - compressed)
   50683 AndroidManifest.xml (OK - compressed)
   53096 assets/Assets/DB_Normal.db (OK)
  595425 assets/Assets/Common/DM/Structures.xml (OK - compressed)

我错过了什么?第一个数字是资源的位置吗?例如 Structures.xml 似乎位于 595425 ,这不是4个字节的倍数 .

1 回答

  • 7

    对齐对压缩数据无关紧要 .

    我们的想法是能够对未压缩的块进行内存映射并直接访问它们 . 例如,如果您的PNG解码器尝试以32位整数访问数据,并且您有一个模拟最坏情况ARM CPU行为的仿真器并在您执行未对齐的32位访问时抛出SIGBUS,那么您不能轻易如果未对齐,则访问图像数据 .

    zlib inflate代码不关心数据是否对齐,因此zipalign不会干扰对齐压缩数据 .

相关问题