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
注意事项
- 如果您使用apksigner,则只能在APK文件签名之前执行zipalign 。如果您使用apksigner对APK进行签名并对APK进行进一步更改,则其签名将失效。
- 如果您使用jarsigner,则只能在APK文件签名后执行zipalign 。
apkSigner
是在Android N 引入的新一代签名(V2 signer), 为什么不能再签名后使用zipAlign呢,这一点文档里也有说明
注意:如果您使用 APK Signature Scheme v2 签署您的应用,并对应用进行了进一步更改,则应用的签名将无效。出于这个原因,请在使用 APK Signature Scheme v2 签署您的应用之前、而非之后使用 zipalign 等工具。
这是因为V2签名的限制,在第一次签名后,如果二进制的内容有所改变,这个签名就会被无效
为什么要对齐
为什么要对齐呢?为什么是4字节呢?
因为 4* 8 = 32位, CPU读取内存数据的时候,例如32位处理器就是一次只能处理32位,也就是4个字节的数据,如果没有对齐, 假设一个数据从第3个字节开始,那CPU读取这个数据时,就需要跨两个 4字节 ,做拼接的操作才能完成真正的4字节数据的读取.
如果我们在build时事先做了字节对齐,那么 CPU调用时的效率就会提高很多.
网友评论