将本地的java从版本1.6 升级到 1.8 的时候,apk 签名后安装到手机上,出现 “Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]”,弄了半天不知道咋回事,然后把java的jdk版本切换到1.6的时候,一切又正常了,因此怀疑对apk的签名,会跟jdk的版本不同而有所不同。网上搜了一下,果然如此,而且在android的开发者社区已经有了相关说明。
注:文章参考了 android 开发者社区的签名指引说明文章,但由于在国内 android 开发者社区已经无法正常访问,因此在这里做下记录。
地址:http://developer.android.com/tools/publishing/app-signing.html#considerations
在开发 android 应用程序的时候,到最后程序都需要进行签名后才可以发布,目前针对 android 应用开发的 ide 一般都会自带了签名的功能,例如 android studio、eclipse、intellij idea。如果您喜欢使用 ide 自带的功能签名,您就不需要再继续往下看了。以下主要是进行 android apk 手动签名的教程,虽然本人并不是很喜欢这种方式,但是公司的两位前辈都比较倾向于使用 bash 脚本,像这种打版本的事情就一般都是走脚本,一句命令,版本打好,发布关机走人。因此以下所用到的命令都是在 cygwin 的环境下执行的,因此前面带有 $ 这个符号。 【ps :我不喜欢主要是不大懂 linux 的语法,哎,要记得东西太多了。】
到目前为止,网上关于 android apk 签名的教程一般都停留在 java 1.6 版本或者之前,然而 java 现在已经更新到了 1.8 了,java 1.7 版本我并没有安装,就直接从 java 1.6 升级为 java 1.8 了,java 1.6 与 java 1.8 之间生成密钥和签名的命令格式有点不一样,1.6 版本的不在这文章的介绍范围内,网上一搜,基本全都是。
1. 生成密钥 (ps:“密钥” 和 “秘钥” 有什么区别?)
输入命令:$ keytool -genkeypair -v -keystore test.keystore -alias test -keyalg RSA -validity 20000
参数说明:
1. genkeypari:生成密钥对。
2. keystore:密钥库名称,如上所示"test.keystore"。
3. alias:密钥的别名,在签名的时候需要用到。
4. keyalg:密钥算法名称。
5. validity:有效天数。
运行效果图:
2. 验证您所生成的密钥文件。
输入命令:$ keytool -list -v -keystore test.keystore
运行效果图:
3. 执行签名,由于我在写文章的时候没有现成的 apk,因此只在这里添加执行的命令。
输入命令:$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore test.keystore xxx.apk test
参数说明:
1. 在jdk 1.8 的环境下,sigalg 和 digestalg 这两个参数必须带上,否则签名出来的 apk 包是无法安装的。
2. -keystore:后面是您所生成的密钥文件。
3. xxx.apk 是你要签名的 apk。
4. test 是密钥文件的别名。