1.首先了解你的keystore是啥。android
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對應一套信息。bash
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.....spa
3.簽名過程當中命令須要寫的完整,不然使用jdk6和jdk7會形成結果有些許差異。debug
jarsigner -keystore debug.keystore -storepass 123456 -signedjar output.apk -digestalg SHA1 -sigalg MD5withRSA input.apk myalias
上面是完整命令。我以前在使用jdk7時沒有指定digest和sign算法,形成apk沒法安裝。code
嗯,命令很長,推薦寫個sh腳本調用。注意,工具都要在 PATH 中能找到啊。ip
apksigner.sh :md5
#!/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後,隨意調用:get
apksigner.sh input.apk output.apk
完美!
最後,不要忘了zipalign一下
zipalign -v 4 infile.apk outfile.apk