利用zipalign对齐so库回顾
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用zipalign对齐so库回顾相关的知识,希望对你有一定的参考价值。
参考技术A最近公司app要预装华为手机,要进行一系列的优化,这里记录下app so库进行对齐的过程。
上文是google官网对zipalign的简介,我的理解是: 按着有利于系统处理的排列方式,对我们apk中的资源文件进行排列,提高资源的查找速度,从而去提高应用的运行效率 。我们知道APK其实是个Zip压缩文件,从原理上来讲就是通过格式化Zip文件夹中二进制文件的序列,达到提升系统解析速度。zipalign使用了4字节的边界对齐方式来影射内存,通过空间换时间的方式提高执行效率。
我本机地址:/Users/cui/Documents/android/sdk/build-tools/28.0.0/zipalign
可以在这里找到 /path/to/sdk/build-tools/<build-tools-version>/zipalign ,或者你自己find一下
Android在M版本上做了直接加载APK内部so的方案,相比之前只能加载so上的方案,大大减少了预置APK时候的文件数量,方便预装和文件管理,也从一定程度上加速了应用启动。这里有两个要求:一是so要用store方式存储,二是so要做页对齐(4096字节对齐)。
获取 zipalign -c -v -p 4 xxx.apk > out.txt 的输出结果,输出结果中
检查lib目录下所有的so文件,必须都为store存储且页对齐才能内加载。
如果so的信息为: (OK) ,则说明做了页对齐,也是store存储的;
如果so的信息为: (OK - compressed) ,则说明有对齐,但不是store存储的;
如果so的信息为: (BAD - ###) ,则说明没有对齐。
这一步要将so从APK中解压出来,然后再重新以store方式打包进去。具体分这么几步
因为v2签名方式的话,先做签名再做对齐的话会破坏apk的签名,所以还需要再重新签名一次,这里我用得是Apksigner,具体可以看官网。
gradle构建中也有api可以做到自动优化,在对应 flavor 中开启即可。
Android ------ 360加固出现预签名失败align error
项目加固的时候,遇到一个这样的问题:预签名失败align error
360官方给的答案:
align error是指您的app没有做zipalign对齐,用zipalign对齐工具对齐一下:
如果是v1签名,加固-签名-zipalign对齐;
如果是v2签名,加固-zipalign对齐-签名。
最终网上查资料解决
apksigner 的介绍及安装
apksigner 包含在 Android SDK Tools 中,可通过 android studio 中 Tools -> Android -> SDK Manager -> SDK Tools 查看是否安装。
如图:每个对应的版本下都有一个apksigner
使用:cmd 打开命令控制器,进入到该目录下就可以了(当然了也可以直接配置,把这个路径配置到用户变量中,记得重启也可以使用)
我是直接切换到该路径下使用的,使用时注意选择的版本尽量是你项目的最大版本
如图:
通过 sign 命令给 apk 进行签名
通过如下命令对 apk 签名
apksigner sign --ks xxx.jks app.apk
xxx.jks 自己项目的签名文件 .jks (根路径)
app.apk 要签名的apk (根路径)
通过 verify 命令检查 apk 是否被签名
如果不知道 apk 是否被签名,可以通过如下命令来检查
apksigner verify app.apk
官方文档:https://developer.android.google.cn/studio/command-line/apksigner?hl=zh-cn#usage-sign
对齐操作
zipalign -p -f -v 4 app.apk outfile.apk
app.apk 要对齐的apk (根路径)
outfile.apk 输出的apk (根路径)
尽管在签名前先对app进行了对齐操作,但是并不能保证每次都能成功;因为对齐操作会出现对齐失败的情况。
对于这种失败的情况,通过研究实验得出,只需要针对 对齐失败的apk 进行第二次对齐,就基本能对齐成功,最后再对app进行签名操作。
针对这个问题我们一般只需要对要加固的应用进行签名就好了,签名之后在去加固应用基本就没什么问题了。
官方文档:https://developer.android.google.cn/studio/command-line/zipalign?hl=zh-cn
以上是关于利用zipalign对齐so库回顾的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio 2.2 更新:未使用新的 Gradle 插件 2.2.0 生成对齐的 APK (zipAlign)
Android Studio 2.3 正在生成未对齐的签名 APK 而不是 zipaligned?
zipalign 未随 Java SDK / JRE 一起安装
Android ------ 360加固出现预签名失败align error