本文首发于公众号【一个老码农】
前段时间升级了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.ap
k是指加固后的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
的绝对路径。