为什么要zipAlign

ZipAlign

zipalign是一个存档对齐工具,可为Android应用程序(APK)文件提供重要的优化。目的是确保所有未压缩数据以相对于文件开头的特定对齐开始。具体来说,它会导致APK中的所有未压缩数据(如图像或原始文件)在4字节边界上对齐。对齐以后,系统就能更加快速的调用APP内的资源

配置

只需要在项目中gradle中配置zipAlignEnabled, 在构建的时候就会自动帮我们执行

buildTypes {
    release {
        //Zipalign优化
        zipAlignEnabled true
    }

    debug {
        //Zipalign优化
        zipAlignEnabled false
    }
}
  • 当然也可以手动对齐
    zipalign [-f] [-v] <alignment> infile.apk outfile.apk

-f :覆盖现有的outfile.zip
-v :详细输出
-p :outfile.zip应该对infile.zip中的所有共享对象文件使用相同的页面对齐方式
-c :确认给定文件的对齐方式

  • 确认是否对齐
    zipalign -c -v <alignment> existing.apk

ZipAlign on V1 & V2

  • 如果您使用apksigner,则只能在APK文件签名之前执行zipalign 。如果您使用apksigner对APK进行签名并对APK进行进一步更改,则其签名将失效。
  • 如果您使用jarsigner,则只能在APK文件签名执行zipalign 。

Q: V2 signer为什么不能在签名后使用zipAlign呢?
A: 这是因为在V1签名中信息摘要是按照文件的颗粒度来执行的, 而V2签名中则是将apk中所有数据的字节划分为1M大小的bucket再进行摘要.
在 v1 仅针对单个 ZIP 条目进行验证,因此,在 APK 签署后可进行许多修改 — 可以移动甚至重新压缩文件。事实上,编译过程中要用到的 ZIPalign 工具就是这么做的,它用于根据正确的字节限制调整 ZIP 条目,以改进运行时性能。
而 v2 签名将验证归档中的所有字节,而不是单个 ZIP 条目,因此,在签署后无法再运行 ZIPalign(必须在签名之前执行)

引用一张构建时 V1 和 V2的图


image.png

为什么要对齐

在文件对齐后, 就可以使用mmap来直接读写apk文件.
正常的IO读写需要借助内核态的页缓存, 也就是 磁盘 ->内核页缓存 ->用户主存
mmap借助映射可以跳过内核页缓存, 只需要磁盘 ->用户主存

Linux是以page为单位管理内存的,mmap也是以page为单位建立映射的,因此offset必须是按page size对齐的(不对齐的话就会映射失败)。文件是有长度的,offset和offset+length的值都应该小于被映射文件的长度。
具体可以参考 https://zhuanlan.zhihu.com/p/71517406

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 关于作者: 李涛,腾讯Android工程师,14年加入腾讯SNG增值产品部,期间主要负责手Q动漫、企鹅电竞等项目的...
    稻草人_3e17阅读 3,940评论 0 10
  • 目录一、Python打包及优化(美团多渠道打包)二、Gradle打包三、其他打包方案:修改Zip文件的commen...
    守望君阅读 5,951评论 4 17
  • [TOC] 打包流程 前言 我们每一个产品中一般都是由一位同事来负责打包工作的,其他同学一般是不需要关心具体的流程...
    钟金宝阅读 1,746评论 0 5
  • 转载请注明出处:https://www.jianshu.com/p/308515c94dc6github:http...
    rushjs阅读 19,809评论 4 38
  • 2017-10-12 星期四 稍晴 昨天晚上,在做好吃的,炸鸡柳。我在厨房里忙碌,烧红了的油滋啦地在锅里冒...
    晓子夜阅读 407评论 0 2

友情链接更多精彩内容