问题描述
未签名的app在安装时adb会返回错误,问题是如何给apk签名?
-
为什么要签名:为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本的一致性(如自动更新不会因为版本不一致而无法安装)
-
PC签名和Android签名的区别:
- PC端程序的签名是找证书机构申请的(需要花银子),证书中有:公司信息;颁发机构信息;证书的有效期,如下所示:
- Android程序的签名只要保持统一(与后续版本的密钥库一致)就行,作用是防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,因此Android程序没有必要验证签名是否是sogou.com的,只要有签名,且所有版本保持一致即可
如何给apk签名
- 有一个私钥(keystore)和这个keystore的口令
- 签名私钥:可以自己生成(如有现成的,需要知道私钥的口令;)
具体操作步骤
前提:安装JDK环境,并且将bin配置环境变量
- 生成一个私钥,使用keytool.exe(JDK自带的)
- 在cmd里直接输入以下命令,按照提示操作,主要是记住密钥库口令,密钥和密钥库的口令可保持一致,也可不保持一致,其他信息随便填写
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
- 用生成的私钥对app进行签名, 在cmd命令里直接输入:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name
注:上面的方法会使用签名后的apk直接将之前未签名的apk覆盖掉,如不想被覆盖,如下方法:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name -signedjar demo_signed.apk
注:网上很多提供签名的命令都是:
``` jarsigner -verbose -keystore demo.keystore -signedjar demo_signed.apk demo.apk demo.keystore
```,签名后安装仍然显示没有签名,原因是:
As of JDK 7, the default signing algorithim has changed, requiring you to specify the signature and digest algorithims (-sigalg and -digestalg) when you sign an APK
写在最后
- 更多的信息可以参考http://developer.android.com/intl/zh-cn/tools/publishing/app-signing.html
- 查看keytool生成密钥的方法:
- 签名jarsigner的用法