给apk文件签名主要分三步,创建证书(如果没有)-->签名-->优化(可选
)
1)使用jdk的keytool工具生成签名用的证书
> keytool -genkey -v -keystore CERT.keystore -alias CERT -keyalg RSA -keysize 2048 -validity 10000
创建过程需要输入一些标识信息和密码,一些重要的参数值说明如下(根据自己的需要要进行相应的修改):
CERT.keystore ---- 证书保存的文件名
CERT ---- 证书的别名
10000 ---- 10000天的有效期
2048 ---- 默认为1024 bits,Android 建议使用2048 bits或更高
其他的详细信息可以使用keytool -help查看帮助
证书生成后使用如下命令可以查看证书的信息:
> keytool -list -alias CERT -keystore CERT.keystore
2)使用jdk的jarsigner工具对apk文件签名
> jarsigner -verbose -keystore CERT.keystore to_sign.apk CERT
签名过程需要输入证书的密码,一些重要的参数值说明如下(根据自己的需要要进行相应的修改):
CERT.keystore ---- 证书保存的文件名
CERT ---- 证书的别名
待签名的apk文件根根目录下如果有文件夹“META-INFO”,请先删除(重新签名就需要这样做)。
如果不想创建过程输出太多信息,可以删除“-verbose” 。
上述签名会直接覆盖原来的文件,如果不想被覆盖而签名为另外的新文件 signed.akp,
只需将 to_sign.apk 改为 -signedjar to_sign.apk signed.akp 即可。
jarsigner -keystore CERT.keystore -signedjar target.apk source.apk CERT
签名后可以使用如下命令验证是否签名成功:
> jarsigner -verify to_sign.apk
如果需要查看更详细的验证信息,可修改为:
> jarsigner -certs -verbose -verify to_sign.apk
3)使用android sdk的zipalign工具优化已签名的apk文件
> zipalign -v 4 unaligned.apk aligned.apk
注意要在签名后再zipalign。这个工具不是jdk自带的,而是在%ANDROID_HOME%\tools\zipalign.exe。
--------------------------------
在给生成的apk签名,jdk1.6升级到jdk1.7会出现以下问题:
1.明明签名了,并且签名检查apk中也有签名文件,但是安装的时候就是提示安装失败,没有签名,解决办法
将签名命令上加一段话: -digestalg SHA1 -sigalg MD5withRSA 加上后就可以了
旧:jarsigner -keystore test.keystore -storepass test123 -signedjar signed_client.apk client.apk test
新:jarsigner -digestalg SHA1 -sigalg MD5withRSA -keystore test.keystore -storepass test123 -signedjar signed_client.apk client.apk test
这样签名完成后就可以安装成功了。
2.以上方法可以解决签名后不能安装成功的问题,但是会发现有警告:
警告:
未提供 -tsa 或 -tsacert, 此 jar 没有时间戳。如果没有时间戳, 则在签名者证书的到期
日期 (2063-07-18) 或以后的任何撤销日期之后, 用户可能无法验证此 jar。
入有这个警告的话本身对签名没有影响,但是总感觉怪怪的,要想去掉这个警告只要在命令上再加上 -tsa https://timestamp.geotrust.com/tsa 就可以了
最终命令是:
jarsigner -digestalg SHA1 -sigalg MD5withRSA -tsa https://timestamp.geotrust.com/tsa -keystore test.keystore -storepass test123 -signedjar signed_client.apk client.apk test