天天看點

apk數字簽名

1、準備工作

apk的簽名工作可以通過兩種方式來完成:

1)通過ADT提供的圖形化界面完成apk簽名;

右鍵項目——》 Android Tools ——》Export Signed Application Package... ——》 打開圖形界面

2)完全通過shell/dos指令來完成apk簽名

我比較喜歡第2)種方式,是以下面将講解如何通過指令的方式完成apk簽名。

給apk簽名一共要用到3個工具,或者說3個指令,分别是:keytool、 jarsigner、 zipalign,下面是對這3個工具的簡單介紹:

1)keytool:生成數字證書,即密鑰,也就是上面說到的擴充名為.keystore的那類檔案;

2)jarsigner:使用數字證書給apk檔案簽名;

3)zipalign:對簽名後的apk進行優化,提高與Android系統互動的效率(Android SDK1.6版本開始包含此工具)

從這3個工具的作用也可以看出,這3個工具的使用順序。通常我們自己所開發的所有應用程式,都是使用同樣的簽名,即使用同一個數字證書,這就意味着:如果你是第一次做Android應用程式簽名,上面的3個工具都将用到;但如果你已經有數字證書了,以後再給其它apk簽名時,隻需要用到jarsigner和zipalign就可以完成。

為了友善使用上面3個指令,首先需要将上面3個工具所在路徑添加到環境變量path中(我說的是為了友善使用,沒有說必須要這麼做)。怎麼配置環境變量請參見我先前的部落格(Windows 或 Ubuntu),這裡需要說一下這3個工具預設所在的路徑:

1)keytool:該工具位于jdk安裝路徑的bin目錄下;

2)jarsigner:該工具位于jdk安裝路徑的bin目錄下;

3)zipalign:該工具位于Android-sdk-windows/tools/目錄下

不知道大家是否注意到keytool和jarsigner兩個工具是jdk自帶的,也就意味着生成數字證書和檔案簽名不是Android的專利;另外從字面上了解jarsigner也能猜得出該工具主要是用來給jar檔案簽名的。

2、生成未經簽名的apk檔案

既然我們要自己對apk進行簽名,就不再需要ADT預設幫我們簽名了。如何得到一個未經簽名的apk檔案呢?打開Eclipse,在Android工程名稱上點選右鍵,依次選擇“Android Tools” - “Export Unsigned Application Package ...”,然後選擇一個存儲位置儲存即可。這樣就得到了一個未經簽名的apk檔案。

3、使用keytool工具生成數字證書

複制代碼 代碼如下:

keytool -genkey -v -keystore it-homer.keystore -alias it-homer.keystore -keyalg RSA -validity 20000

說明:

1)keytool是工具名稱,-genkey意味着執行的是生成數字證書操作,-v表示将生成證書的詳細資訊列印出來,顯示在dos視窗中;

2)-keystore  it-homer.keystore 表示生成的數字證書的檔案名為“ it-homer.keystore”;

3)-alias  it-homer.keystore 表示證書的别名為“ it-homer.keystore”,當然可以不和上面的檔案名一樣;

4)-keyalg RSA 表示生成密鑰檔案所采用的算法為RSA;

5)-validity 20000 表示該數字證書的有效期為20000天,意味着20000天之後該證書将失效

在執行上面的指令生成數字證書檔案時,會提示你輸入一些資訊,包括證書的密碼,示例如下:

4、使用jarsigner工具為Android應用程式簽名

複制代碼 代碼如下:

jarsigner -verbose -keystore  it-homer.keystore -signedjar notepad_signed.apk notepad.apk  it-homer.keystore

說明:

1)jarsigner是工具名稱,-verbose表示将簽名過程中的詳細資訊列印出來,顯示在dos視窗中;

2)-keystore  it-homer.keystore 表示簽名所使用的數字證書所在位置,這裡沒有寫路徑,表示在目前目錄下;

3)-signedjar notepad_signed.apk notepad.apk 表示給notepad.apk檔案簽名,簽名後的檔案名稱為notepad_signed.apk;

4)最後面的 it-homer.keystore 表示證書的别名,對應于生成數字證書時-alias參數後面的名稱

5、使用zipalign工具優化已簽名的apk(非必須但建議這麼做)

複制代碼 代碼如下:

zipalign -v 4 notepad_signed.apk notepad_signed_aligned.apk

說明:

1)zipalign是工具名稱,-v表示在DOS視窗列印出詳細的優化資訊;

2)notepad_signed.apk notepad_signed_aligned.apk 表示對已簽名檔案notepad_signed.apk進行優化,優化後的檔案名為notepad_signed_aligned.apk

說明:如果你以前的程式是采用預設簽名的方式(即debug簽名),一旦換了新的簽名應用将不能覆寫安裝,必須将原先的程式解除安裝掉,才能安裝上。因為程式覆寫安裝主要檢查兩點:

1)兩個程式的入口Activity是否相同。兩個程式如果包名不一樣,即使其它所有代碼完全一樣,也不會被視為同一個程式的不同版本;

2)兩個程式所采用的簽名是否相同。如果兩個程式所采用的簽名不同,即使包名相同,也不會被視為同一個程式的不同版本,不能覆寫安裝。

另外,可能有人可能會認為反正debug簽名的應用程式也能安裝使用,那也沒有必要自己簽名了嘛。千萬不要這樣想,debug簽名的應用程式有這樣兩個限制,或者說風險:

1)debug簽名的應用程式不能在Android Market上架銷售,它會強制你使用自己的簽名;

2)debug.keystore在不同的機器上所生成的可能都不一樣,就意味着如果你換了機器進行apk版本更新,那麼将會出現上面那種程式不能覆寫安裝的問題。不要小視這個問題,如果你開發的程式隻有你自己使用,當然無所謂,解除安裝再安裝就可以了。但要是你的軟體有很多使用客戶,這就是大問題了,就相當于軟體不具備更新功能