问题困扰了我大半个月,最后通过查官方文档解决,记录一下处理思路;
业务需求是:在Ubuntu服务器上解压apk文件,修改安装包内图片和配置文件,然后打包签名生成新apk,下面是签名方法:
apksigner sign --ks 签名证书路径 --ks-key-alias 证书别名 --out 签名完成后安装包输出路径 --ks-pass pass:证书密码 --key-pass pass:key密码 需要签名的安装包路径
使用该方法签名后部分apk文件会出现下面这个问题:
出现概率很低,但有些安装包一直无法安装
谷歌百度一圈也没找到类似的问题
之后尝试使用mt管理器在手机上使用相同的证书进行签名发现正常安装没有问题
事情就开始变得诡异起来了,猜想是jdk或sdk版本问题,尝试了切java8和java11,也尝试了sdk26~34全都出现一模一样的问题
后面偶然安卓官方文档有提供一个工具: 原文地址
大概意思就是在签名之前需要使用zipalign对齐zip文件后再签名apk:
zipalign -p -f -v 4 原apk路径 对齐后输出的apk路径
果然对齐后再签名就解决了!
apksigner
和zipalign
都在Android SDK安装目录内,可以直接使用,附上Ubuntu配置apk打包环境:
-
安装java11
sudo apt-get install openjdk-11-jdk
-
安装
sdkmanager
,官方教程 -
使用
sdkmanager
下载sdk包:./sdkmanager --install "build-tools;33.0.0" --sdk_root=/www/sdk/
注意sdk对应的jdk版本: