在某些特殊情况下,需要对已经生成的apk进行重新签名,或者对已经生成的apk更换签名版本(v1/v2/v3/v4)。如何实现呢? 可以通过命令行对已生成的apk进行处理。
ps: 已知当前(2021/10/30)vivo应用市场仅支持上传包含V1签名的APK(通常都是v1/v2混合签名或者仅v1签名)。但是如果编译设置的min-sdk-version大于等于26时,就会遇到问题了(正常Android Studio打包的apk不会包含V1签名->无法上传vivo应用市场。如果通过命令强制只签V1版本的签名,可以上传应用市场,应用也可以正常运行,但是新出的Android 11设备已无法正常安装 --不再支持v1签名。)希望vivo应用市场尽快升级吧~~~ 如果不幸真遇到这种问题怎么办呢? 尝试本文最后一条命令对apk签名进行强制V1版本签名试试吧,记得先签v2再强制进行v1签名。
1、获得apksigner.jar
apksigner.jar通常包含在Android SDK中可。路径一般是在Android SDK/build-tools/{SDK版本}/lib/apksigner.jar
不同的SDK版本中均有一个,取最新版本的就好了。
2、删除已有签名
使用压缩软件打开apk,删除包内/META-INF/文件夹及文件夹内所有文件,并重新压缩文件。
3、重新签名
准备好签名证书及相关密码和需要刚处理过得apk文件
示例:
开发者证书:cert.jks
别名: mg
密码: 123456
输入文件: app-release.apk
输出文件: app-release-out.apk
执行命令
java -jar apksigner.jar sign --ks cert.jks --ks-key-alias mg --v1-signing-enabled true --v2-signing-enabled true --out app-release-out.apk app-release.apk
接着输入证书保护密码及别名密码。
校验签名是否成功:
java -jar apksigner.jar verify --verbose --print-certs app-release-out.apk
可以从此命令的输出中看出当前生成的apk签名情况。
控制apk签名使用的版本(v1/v2/v3)
可以通过如下命令行参数进行控制
--v1-signing-enabled true
--v2-signing-enabled true
--v3-signing-enabled false
最后,请特别注意!
使用的签名版本还跟apk编译时使用的最低SDK版本有关, 即min-sdk-version的值。如果设置的值大于等于26,即使添加--v1-signing-enabled true 也无法通过上述步骤签V1版本的签名--仅有V2签名(Android Studio也是)。
可以对最后生成的apk通过执行如下命令尝试:
java -jar apksigner.jar sign --ks cert.jks --ks-key-alias mg --min-sdk-version 21 --max-sdk-version 30 --v1-signing-enabled true --v2-signing-enabled false --v3-signing-enabled false --out app-release-out2.apk app-release-out.apk
网友评论