Android SDK中包含一个“zipalign”的工具,它能够对打包的应用程序进行优化。在你的应用程序上运行zipalign,使得在运行时Android与应用程序间的交互更加有效率。因此,这种方式能够让应用程序和整个系统运行得更快。我们强烈推荐在新的和已经发布的程序上使用zipalign工具来得到优化后的版本——即使你的程序是在老版本的Android平台下开发的。这篇文章将描述zipalign如何有助于性能改善以及如何使用它来优化你的app。
在Android中,当资源文件通过内存映射对齐到4字节边界时,访问资源文件的代码才是有效率的。但是,如果资源本身没有进行对齐处理(未使用zipalign工具),它就必须回到老路上,显式地读取它们——这个过程将会比较缓慢且会花费额外的内存。
Android app签名的流程如下:
--> 生成 private key (keytool 完成)
--> 编译生成unsigned apk (状态:未对齐,未签名)
--> 用private key进行签名 (jarsinger完成) (状态:未对齐,签名)
--> 使用zipalign进行签名 (状态:对齐,签名)
apk只有在签名之后才能使用zipalign进行优化。如果在签名之前就进行align优化,那么在签名时会回退之前的align操作。
因此会先进行签名,在进行align优化。因而中间会产生 unaligned signed apk (app-debug-unaligned.apk).
但是有时候,第三方APK编译到android 系统镜像中,aligned APK之后,会导致APK起不来,或者各种其它问题。但是直接手动安装APK没有问题。解决方法是编译生成APK时,取消aligned APK,out 目录下生成的apk就与手动安装的apk是同一个apk。
1,/build/core/clear_vars.mk文件中添加 :
LOCAL_CONFIG_ZIPALIGN_UNALIGNED_BOOL := # '',true
2,/build/core/definitions.mk文件中添加 :
define align-package_no_zipalign
$(hide) mv $@ $@.unaligned$(hide) mv $@.unaligned $@.aligned
$(hide) mv $@.aligned $@
endef
3,/build/core/dpi_specific_apk.mk 修改:
+ifeq ($(LOCAL_CONFIG_ZIPALIGN_UNALIGNED_BOOL),true)
+ $(align-package_no_zipalign)
+else
$(align-package)
+endif
4,/build/core/prebuilt_internal.mk 修改:(有3处$(align-package) 需要修改)
+ifeq ($(LOCAL_CONFIG_ZIPALIGN_UNALIGNED_BOOL),true)
+ $(align-package_no_zipalign)
+else
$(align-package)
+endif