最近公司app要预装华为手机,要进行一系列的优化,这里记录下app so库进行对齐的过程。
zipalign回顾
zipalign 是一种归档对齐工具,可对 Android 应用 (APK) 文件提供重要的优化。其目的是要确保所有未压缩数据的开头均相对于文件开头部分执行特定的对齐。具体来说,它会使 APK 中的所有未压缩数据(例如图片或原始文件)在 4 字节边界上对齐。这样一来,即可使用
mmap()
直接访问所有部分,即使其中包含具有对齐限制的二进制数据也没关系。这样做的好处是可以减少运行应用时消耗的 RAM 容量。在将 APK 文件分发给最终用户之前,必须先使用此工具对齐文件。您可以使用 Android 编译工具来完成此操作。Android Studio 会自动对齐您的 APK。
上文是google官网对zipalign的简介,我的理解是:按着有利于系统处理的排列方式,对我们apk中的资源文件进行排列,提高资源的查找速度,从而去提高应用的运行效率。我们知道APK其实是个Zip压缩文件,从原理上来讲就是通过格式化Zip文件夹中二进制文件的序列,达到提升系统解析速度。zipalign使用了4字节的边界对齐方式来影射内存,通过空间换时间的方式提高执行效率。
zipalign工具地址
我本机地址:/Users/cui/Documents/Android/sdk/build-tools/28.0.0/zipalign
可以在这里找到 /path/to/sdk/build-tools/<build-tools-version>/zipalign
,或者你自己find一下
find ~/Library/Android/sdk/build-tools -name "zipalign"
利用zipalign来优化应用内加载so
Android在M版本上做了直接加载APK内部so的方案,相比之前只能加载so上的方案,大大减少了预置APK时候的文件数量,方便预装和文件管理,也从一定程度上加速了应用启动。这里有两个要求:一是so要用store方式存储,二是so要做页对齐(4096字节对齐)。
1. 如何检测APK是否可以内加载
获取 zipalign -c -v -p 4 xxx.apk > out.txt
的输出结果,输出结果中
检查lib目录下所有的so文件,必须都为store存储且页对齐才能内加载。
如果so的信息为:(OK),则说明做了页对齐,也是store存储的;
如果so的信息为:(OK - compressed),则说明有对齐,但不是store存储的;
如果so的信息为:(BAD - ###),则说明没有对齐。
2. 如何修改APK可以内加载
这一步要将so从APK中解压出来,然后再重新以store方式打包进去。具体分这么几步
1. unzip xxx.apk 'lib/*.so' -d uncompressedlibs
2. zip -d xxx.apk 'lib/*.so'
3. cd uncompressedlibs
4. zip -D -r -0 ../xxx.apk lib
5. zipalign -f -p 4 xxx.apk xxx_so.apk // so对齐
因为v2签名方式的话,先做签名再做对齐的话会破坏apk的签名,所以还需要再重新签名一次,这里我用得是Apksigner,具体可以看官网。
3. 如何做到自动化?
gradle构建中也有api可以做到自动优化,在对应 flavor 中开启即可。
release {
//Zipalign优化
zipAlignEnabled true
}
网友评论