Answers:
Android开发人员网站上对此机制的描述如下:
zipalign是一个存档对齐工具,可为Android应用程序(.apk)文件提供重要的优化。目的是确保所有未压缩的数据以相对于文件开头的特定对齐方式开头。具体来说,这会使.apk中的所有未压缩数据(例如图像或原始文件)在4字节边界上对齐。这样,即使它们包含具有对齐限制的二进制数据,也可以使用mmap()直接访问所有部分。好处是减少了运行应用程序时消耗的RAM数量。
简而言之:.apk
由于打包文件中数据的顺序,可以更轻松/更快/更优化地访问内容。
有关更多信息,请参见AddictiveTips上的“完整指南”:Android中的Zipalign是什么以及如何使应用程序Zipaligned,它回答了问题的第二部分:
完全可以理解的是,情况将保留给未对齐的应用程序包。资源读取会很慢,内存使用率会更高。这也取决于存在多少未对齐的应用程序。例如,如果带有未对齐主应用程序的应用程序数量较少,则您会看到较慢的应用程序启动时间。这是最好的情况。在最坏的情况下,具有许多未对齐的应用程序将导致系统反复启动和终止进程,从而出现时滞和大量电池消耗的问题。
要在上面添加zipalign的工作原理,
在Android操作环境中,存储在每个应用程序包中的数据文件可以通过多个进程访问,例如,安装程序将读取数据清单以确定相关的权限;系统服务器可以出于多种原因读取这些资源,例如显示通知;例如,Home应用程序将读取资源以获取应用程序的名称和图标。由于Android基于真正的多任务操作基础架构,因此这些文件可以连续重复访问。最后,但并非最不重要的一点是,应用程序本身读取清单数据。
由于Android是基于Linux的,因此内存映射在有效处理进程中起着关键作用。本质上,Android OS资源处理代码的最佳对齐方式是4字节边界。这意味着,如果将APK映射到4个字节的边界,并进行相应的对齐,则OS将无需“读取”整个应用程序包即可获得所需的数据清单。每个系统进程都会事先知道在哪里寻找所需的资源,因此执行起来会更加流畅和快捷。
总结起来,对APK进行zip对齐会使包中的所有未压缩数据在4字节边界上对齐,从而允许使用内存映射直接访问所有部分。执行期间降低了RAM消耗,因为查询代码不必通读整个应用程序包。
struct x { uint16_t id; uint32_t data[100]; };
如果您希望它是32位对齐的,则不要这样做。使用struct x { uint16_t id; uint16_t padding; uint32_t data[100]; };