apk簽名詳細原理及jarsigner版本問題

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
相關文章
相關標籤/搜索