当ROM声称是“ zipaligned”时,这是什么意思?与未进行“ zipaligned”的ROM有什么区别?

#1 楼

在Android开发人员网站上对此机制的描述如下:


zipalign是一个存档对齐工具,它为Android应用程序(.apk)文件提供了重要的优化。目的是确保所有未压缩的数据以相对于文件开头的特定对齐方式开头。具体来说,它会使.apk中的所有未压缩数据(例如图像或原始文件)在4字节边界上对齐。这样,即使它们包含具有对齐限制的二进制数据,也可以使用mmap()直接访问所有部分。好处是减少了运行应用程序时消耗的RAM数量。


总而言之:由于内部的数据顺序,.apk内容可以更容易/更快/更优化地访问包装文件。

有关更多信息,请参见AddictiveTips上的“完整指南”:Android中的Zipalign是什么以及如何使应用程序Zipaligned,它回答了问题的第二部分:


可以理解的是,情况将保留给未对齐的应用程序包。资源读取会很慢,内存使用率会更高。这也取决于存在多少未对齐的应用程序。例如,如果带有未对齐主应用程序的应用程序数量较少,则您会看到较慢的应用程序启动时间。这是最好的情况。在最坏的情况下,具有许多未对齐的应用程序将导致系统反复启动和终止进程,从而导致时滞和大量电池消耗。


评论


对于程序员来说,它或多或少与C中的结构对齐类似。不要做struct x {uint16_t id; uint32_t数据[100]; };如果您希望它是32位对齐的;使用struct x {uint16_t id; uint16_t填充; uint32_t data [100]; };

–马修·雷德(Matthew Read)
2012年9月24日下午16:34

似乎没有缺点,为什么不是所有的应用程序都压缩对齐?难道这真的是最终用户所关心的,还是只与开发人员有关?

–马特
2012年9月24日在20:53

对于我想说的开发人员来说,这是又一个步骤。当然,性能是最终用户关心的;)

– Izzy♦
2012年9月24日21:02

#2 楼

要在上面添加zipalign的确切工作原理,请参见-

在Android操作环境中,多个进程将访问存储在每个应用程序包中的数据文件,例如,安装程序将读取数据清单以确定关联权限;系统服务器可以出于多种原因读取这些资源,例如显示通知;例如,Home应用程序将读取资源以获取应用程序的名称和图标。由于Android基于真正的多任务操作基础架构,因此这些文件将被连续不断地访问。最后但并非最不重要的一点是,应用程序本身会读取清单数据。
由于Android是基于Linux的,因此内存映射在有效处理进程中起着关键作用。本质上,Android OS资源处理代码的最佳对齐方式是4字节边界。这意味着,如果将APK映射到4个字节的内存边界并进行相应对齐,则操作系统将无需“通读”整个应用程序包即可获得所需的数据清单。每个系统进程都会事先知道要在哪里寻找所需资源,因此执行起来会更加顺畅和快捷。
总结起来,对APK进行zipalign会导致包中所有未压缩的数据按4字节对齐边界,允许直接使用内存映射访问所有部分。执行期间降低了RAM消耗,因为查询代码不必通读整个应用程序包。

源代码

评论


为什么不读通整个应用程序包?清单是否保证在特定的偏移量?

–肯尼斯·沃登(Kenneth Worden)
17年7月3日在17:33