APK项目设置target30后出现:
Failure [-124: Failed parse during installPackageLI: Targeting R+ (version 30 and above) requires the resources.arsc of installed APKs to be stored uncompressed and aligned on a 4-byte boundary]
官方解释:
如果以 Android 11(API 级别 30)或更高版本为目标平台的应用包含压缩的 resources.arsc 文件或者如果此文件未按 4 字节边界对齐,应用将无法安装。如果存在其中任意一种情况,系统将无法对此文件进行内存映射。无法进行内存映射的资源表必须读入 RAM 中的缓冲区,从而给系统造成不必要的内存压力,并大大增加设备的 RAM 使用量
zipalign
zipalign 是一种 zip 归档文件对齐工具。它可确保归档中的所有未压缩文件相对于文件开头都是对齐的。这样一来,您便可直接通过 mmap(2)
访问这些文件,而无需在 RAM 中复制相关数据并减少了应用的内存用量。
在将 APK 文件分发给最终用户之前,应该先使用 zipalign 进行优化。如果您使用 Android Studio 进行构建,则此步骤会自动完成。本文档适用于自定义构建系统的维护者。
注意:您必须在应用构建过程中的两个特定时间点之一使用 zipalign,具体在哪个时间点使用,取决于您所使用的应用签名工具:
- 如果您使用的是
apksigner
,只能在为 APK 文件签名之前执行 zipalign。如果您在使用 apksigner 为 APK 签名之后对 APK 做出了进一步更改,签名便会失效。 - 如果您使用的是
jarsigner
,只能在为 APK 文件签名之后执行 zipalign。
解决方案有两种:
1、降低target30以下
2、使用Sdk\build-tools下的zipalign工具做对齐,然后使用apksigner
a.Sdk\build-tools下 找到zipalign.exe 放到指定文件下,可以用CMD到该指定的文件目录下使用命令
//对齐操作命令,4代表对齐为4个字节
//input 输入的apk路径 output 输出的apk路径
zipalign -p -f -v 4 input.apk output.apk
//确认对齐结果命令
zipalign -c -v 4 output.apk
//操作或验证成功后会看到 Verification succesful
b.使用apksigner签名
''' 同时使用v1和v2签名 java -jar apksigner.jar sign //执行签名操作 --ks 你的jks路径 //jks签名证书路径 --ks-key-alias 你的alias //生成jks时指定的alias --ks-pass pass:你的密码 //KeyStore密码 --key-pass pass:你的密码 //签署者的密码,即生成jks时指定alias对应的密码 --out output.apk //输出路径 input.apk //被签名的apk '''
验证签名是否成功:
java -jar apksigner.jar verify -v my.apk