本文首发于公众号【一个老码农】
前段时间升级了Android app的targetSdkVersion。apk经过加固并重新签名后出现了在Android11以上系统无法安装,11以下系统可以正常使用的问题,在小米手机上安装报错:packageInfo is null。
经过排查发现,是因为加固后重新签名使用的是jarsigner命令行的方式,而此方式是属于V1签名,而Android11需要V2以上签名才可以进行安装。并且在签名之前没有进行字节对齐
V1签名:
jarsigner -verbose -keystore xxx.jks -storepass 密码 -signedjar singed.apk jiagu.apk 别名
解决方案:
使用加固工具加固后,apk会被解签名,再次签名时需要先把apk进行字节对齐,然后再用apksigner命令行工具进行签名,而apksigner则支持V1、V2、V3签名。
- apk对齐:
zipalign -p -f -v 4 jiagu.apk aligned.apk
以上命令,jiagu.apk是指加固后的apk,aligned.apk是指对齐后的apk
-
apksigner签名:
apksigner sign --ks xxx.jks --ks-key-alias 别名 --ks-pass pass:jks密码 --key-pass pass:别名密码 --out result.apk aligned.apk
经过以上命令后,result.apk即是我们需要的最终的安装包
注意:Android studio自带zipalign和apksigner命令,如果提示命令不存在,则需要进行环境变量配置,或者命令行执行时直接指定zipalign和apksigner的绝对路径。