Android 打生产包(release)生成密钥(证书)及签名
参考官方文档
生成密钥(证书)文件
keytool -genkey -v -keystore release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
keytool | 是一个工具命令 |
-v | 指的是将生成证书的详细信息打印到终端 |
-genkey | 表示生成key |
-keystore release-key.keystore | 指定生成的密钥文件名,release-key.keystore就是指定的文件名,.keystore是证书的扩展名 |
-alias alias_name | 别名,这里指定别名为alias_name |
-keyalg RSA | 生成密钥文件所用的算法,这里为RSA |
-validity 10000 | 该密钥的有效天数 |
-keysize 2048 | 指定2048位的密钥 |
执行上述命令后,会在当前目录下生成一个release-key.keystore文件,如果当前目录下已有同名文件,则执行命令时会报密码错误(密码与之前创建这个密钥文件的密码不同时)
过程中会要求设置keystore密码和key密码。(这个文件只需生成一次)
生成的这个证书文件及密码一定要保存好,丢了的话,后面修改App后,再发布,已安装了旧版APP的用户就不能直接升级了,只能重新安装。
查看证书信息
keytool -list -v -keystore release-key.keystore
然后输入口令,会显示此密钥文件中的相关信息,包括SHA1等
打生产包
ionic cordova build android --release
成功的话会在以下位置生成apk文件
ionic3(项目目录/platforms/android/build/outputs/apk/android-release-unsigned.apk)
ionic4(项目目录platforms/android/app/build/outputs/apk/release/app-release-unsigned.apk)
绑定密钥(证书)文件
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore release-key.keystore apk/android-release-unsigned.apk alias_name
说明:
jarsigner |
工具名称 |
-verbose | 指的是将生成证书的详细信息打印出来,显示在dos窗口 |
-keystore release-key.keystore | 意思是签名所使用的数字证书的位置,没有写路径则表示在当前目录下 |
apk/android-release-unsigned.apk | 意思是apk所在的文件位置,注意apk的/符号指的是在名字为apk这个文件的里面,如果不指定目录默认为当前目录 |
cordova-demo | 指的是在生成签名的时候使用的别名 |
-sigalg与-digestalg | 密钥格式 |
命令完成后这个APK就已经改变
如果出现以下报错
java.util.zip.ZipException: invalid entry compressed size (expected 13283 but got 12029 bytes)
可以尝试在命令中加 -signedjar myname-singed.apk
意思就是绑定签名后生成一个新的APK文件,后面myname-singed.apk是自己起的文件名。
打包签名注意事项:
打debug包时计算机会默认生成一个签名自动绑定debug包,所以debug包不可以再加手动签名,会导致冲突,但是不同的机器上面打出来的debug包生成的签名都会不同,无法覆盖安装,
打release包时需要手动创建签名文件,随后将release包与签名绑定。没有签名文件的release包安装时会提示没有安全证书,无法安装apk包。在不同机器上打出来的release包只要是绑定的签名文件一致,就可以实现覆盖安装
Align压缩优化
zipalign -v 4 原apk文件 压缩后apk文件,例:
zipalign -v 4 android-release-unsigned.apk MyExrApp.apk