APK重新签名或者更换APK签名版本

在某些特殊情况下,需要对已经生成的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

如果本文对你有帮助就点个赞支持下吧~

你可能感兴趣的:(APK重新签名或者更换APK签名版本)