利用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

Android ------ 360加固出现预签名失败align error

Android ------ 360加固出现预签名失败align error