1.签名的意义
为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本的一致性(如自动更新不会因为版本不一致而无法安装)。
2.签名的方法:
a:使用命令行进行签名
b:直接使用Eclipse进行签名
(a):使用命令行签名(jdk为1.7)
签名分两个部分:
生成私钥
keytool:
Keytool 选项 描述
-genkey 产生一个键值对(公钥和私钥)
-v 允许动作输出
-alias 键的别名。只有前八位字符有效。
-keyalg 产生键的加密算法。支持DSA和RSA。
-keysize 产生键的长度。如果不支持,keytool用默认值1024 bits.通常我们用2048 bits 或更长的key。
-dname 专有名称,描述谁创建的密钥。该值被用作自签名证书的颁发者和主题字段。注意你可以不在命令行指定。如果没有指定keytool会提示你(CN, OU, and so on)。
-keypass 键的密码;主要为了安全起见,如果没提供,keytool会提示你输入。
-validity 键的有效期,单位:天
Note: A value of 10000 or greater is recommended.
-keystore.keystore 用于存储私钥的文件。
-storepass 私钥存储文件的密码;主要为了安全起见,如果没提供,keytool会提示你输入。这个密码不会存储在你的shell历史记录中。
命令:
keytool -genkey -v -keyalg DSA -keysize 1024 -sigalg SHA1withDSA -validity 20000 -keystore MyDevel.keystore -alias devel -keypass MyDevel -storepass MyDevel
用私钥进行签名
jarsigner:
Jarsigner 选项 描述
-keystore.keystore 包含你私钥的存储文件
-verbose 显示输出动作。
-sigalg 签名算法,用 SHA1withRSA.
-digestalg 消息摘要算法,用 SHA1.
-storepass 存储文件的密码;主要为了安全起见,如果没提供,jarsigner会提示你输入。这个密码不会存储在你的shell历史记录中。
-keypass 私钥的密码;主要为了安全起见,如果没提供,jarsigner会提示你输入。这个密码不会存储在你的shell历史记录中。
命令行:
jarsigner -verbose -sigalg SHA1withDSA -digestalg SHA1 -keystore myDevel.keystore -storepass MyDevel test.apk devel
(b)使用Eclipse进行签名
第一种情况,在没有签名的情况下,需要自己创建
在已经有keystore的情况下,密码为你创建时的密码
最后,在相应的目录下游apk文件。