1.首先了解你的keystore是啥。
keytool -list -v -keystore /Users/mac/.android/debug.keystore
别名: androiddebugkey
创建日期: 2013-11-30
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=Android Debug, O=Android, C=US
发布者: CN=Android Debug, O=Android, C=US
序列号: 565bb50d
有效期开始日期: Mon Nov 30 10:31:41 CST 2013, 截止日期: Wed Nov 22 10:31:41 CST 2099
证书指纹:
MD5: A4:4A:9F:CA:5B:F9:BB:4C:04:5B:B7:FF:35:70:F3:13
SHA1: 80:E5:B2:E4:DC:16:AB:B8:79:70:59:CD:0F:ED:F3:3B:CB:66:CA:6A
SHA256: 0A:8W:64:74:69:0A:D7:R4:C6:72:86:67:35:9D:DC:BA:D2:CB:45:D7:04:E0:81:7F:70:A3:0C:CF:E4:93:B2:BF
签名算法名称: SHA1withRSA
版本: 3
这个是自动生成的debug签名keystore,对apk进行签名后,其中的指纹信息会包含进apk中,每个apk对应一套信息。
2.在手机上更新apk,应用检验等多种情况会使用到这些指纹信息。
PackageManager pm = getContext().getPackageManager();
PackageInfo packageInfo = pm.getPackageInfo("com.xxx.xxx", 64);
Signature[] signatures = packageInfo.signatures;
byte[] bytes = signatures[0].toByteArray();
String md5 = MD5(bytes);
获得的md5串就等于上面的MD5的值,为a44a9fcaxxxxxxxx.....
3.签名过程中命令需要写的完整,否则使用jdk6和jdk7会造成结果有些许差别。
jarsigner -keystore debug.keystore -storepass 123456 -signedjar output.apk -digestalg SHA1 -sigalg MD5withRSA input.apk myalias
上面是完整命令。我之前在使用jdk7时没有指定digest和sign算法,造成apk无法安装。
嗯,命令很长,推荐写个sh脚本调用。注意,工具都要在 PATH 中能找到啊。
apksigner.sh :
#!/bin/bash
if [ $# != 2 ]
then
echo "usages:" $0 "inputFile" "outputFile"
exit 1
fi
jarsigner -keystore /to/your/path/debug.keystore -storepass 123456 -signedjar $2 -digestalg SHA1 -sigalg MD5withRSA $1 myalias
加入PATH后,随意调用:
apksigner.sh input.apk output.apk
完美!
最后,不要忘了zipalign一下
zipalign -v 4 infile.apk outfile.apk