证书过期了?!!
也不知到当初是那条筋搭错了,将证书的时间弄得这么短,在这里强烈的提醒一下各位,在生成证书的时候一定要注意一下时间,一般将时间设在25年以上就可以了(上架到google play是必须在25年以上的)。现在证书过期了,那么没办法,只能换了,直接替换证书会有一个问题就是需要将之前的旧证书的app卸载之后才能重装。这就问题大了。这样用户的数据不就没了吗?看来还是得找别的方案。
V1和V2签名方式
用过Android studio的打包就会知道,在签名那块是有V1和V2两种的,勾选就可以了,使用gradlew
命令去打包的也可以在build.gradle(app)
中设置的:
signingConfigs {
release {
//code...
v1SigningEnabled true //启用v1
v2SigningEnabled true //启用v2
}
}
V3签名方式
V2,解决了V1不安全的问题。V3要解决的问题就是让不同证书之间可以平滑过渡。(但是V3签名方式是有限制的,下面再说)
看了一下官方,发现签名方式有V3了(悄悄地告诉你,还有V4了)。于是就看了一下,大致的签名方式是这样的:
首先,你得准备一些文件:
old_project.jks (旧的证书,在我这就是我那过期的证书)
new_project.jks (新的)
old.apk(一个使用旧证书打包的apk,没有证书的也行)
apksigner(用于apk签名的工具,请使用29.0.2以上的,这个是在sdk中build-tools文件夹下找到的)
第二步:这一步称之为轮替,也叫沿袭,生成lineage
,通过下面这条命令就可以了:
apksigner rotate --out lineage --old-signer --ks old_project.jks --new-signer --ks new_project.jks
这样就会在当前文件夹下新生成一个名为“lineage”的文件。(这个文件很重要),这一步是必须旧证书在前,新证书在后,这样才是一个正确的轮替。(虽然换过来也是成功的)
第三步:使用上面所有的东西(包括生成的lineage)作V3签名:
apksigner sign --ks old_project.jks --next-signer --ks new_project.jks --lineage lineage --out release.apk --in old.apk
这样就完成了,你可以通过命令去检查一下是否已经是启用了V3
apksigner verify --verbose release.apk
可以看到V3的那一行已经是true了。
鸡肋的V3
真正研究过之后发现,V3签名,很是鸡肋:
首先,V3是android 9.0开始支持的。也就是说如果你的手机是Android9.0之前的,都不能覆盖安装,第二,由于证书过期了,那么就是说无法上架到应用宝(可能有些应用市场是能上的,但是大多数应用市场是上不了的),那么使用V3签名方式打包之后的apk,由于打包过程使用了个密钥库(也就是两个.jks
文件),你猜猜apk的签名是谁的呢?使用keytool -list -printcert -jarfile
命令查看了一下,是旧的!!!(也就是轮替的时候放在前的证书)。所以依旧是上架失败的!!!白忙活了。除非应用市场将其检验方式换成V3的应该就可以了,可是并非所有版本的Android系统都可以直接覆盖安装,所以就算是安全上架了,系统版本低的还是要卸载才能安装。可能应用市场也是基于这个考虑吧。
最后
如果需要更详细的了解V3签名方案,可以查看官方文档Apk签名方案V3
更加详细的签名操作可以看这里apksigner
最最后
希望大家在开始项目的时候一定要检查一下使用的证书是不是有问题。如果有,赶紧重新弄一个!!!!!