Android系統要求所有的程式經過數位簽章才能安裝,如果沒有可用的數位簽章,系統將不許安裝運行此程式,不管是模擬器還是真實手機。因此,在裝置或者是模擬器上運行偵錯工具之前,必須為應用程式設定數位簽章。Android系統僅僅會在安裝的時候測試簽署憑證的有效期間,如果應用程式的簽名是在安裝之後才到期,那麼應用程式仍然可以正常啟用。
Android通過數位簽章來標識應用程式的作者和在應用程式之間建立信任關係,不是用來決定使用者可不可以安裝該應用程式。android的這個簽名由應用程式的作者完成,並不需要權威的數位憑證簽名機構認證,他只是用來讓應用程式套件組合自我認證的。Android系統預設自動給應用程式簽名,ADT會自動使用debug密鑰為應用程式簽名,debug密鑰是一個名為debug.keystore的檔案,位置位於電腦的:
/Documents and Settings/liuhua/.Android/debug.keystore,其中的liuhua是電腦的使用者名稱。
下面介紹手動簽名:
1. apk的簽名工作可以通過兩種方式來完成:
1)通過ADT提供的圖形化介面完成apk簽名;
2)完全通過DOS命令來完成apk簽名
給apk簽名一共要用到3個工具(3個命令),分別是:keytool、jarsigner和zipalign
1)keytool:產生數位憑證,即密鑰,也就是上面說到的副檔名為.keystore的那類檔案;
2)jarsigner:使用數位憑證給apk檔案簽名;
3)zipalign:對簽名後的apk進行最佳化,提高與Android系統互動的效率(Android SDK1.6版本開始包含此工具)
通常你開發的所有應用程式,都是使用同樣的簽名,即使用同一個數位憑證。如果你是第一次做Android應用程式簽名,上面的3個工具都將用到;但如果你已經有數位憑證了,以後再給其它apk簽名時,只需要用到jarsigner和zipalign就可以完成。另外,keytool和jarsigner兩個工具是jdk內建的,也就意味著產生數位憑證和檔案簽名不是Android的專利;另外從字面上理解jarsigner也能猜得出該工具主要是用來給jar檔案簽名的。
3個工具預設所在的路徑:
1)keytool:該工具位於jdk安裝路徑的bin目錄下;
2)jarsigner:該工具位於jdk安裝路徑的bin目錄下;
3)zipalign:該工具位於Android-sdk-windows/tools/目錄下
2.產生未經簽名的apk檔案
開啟Eclipse,在Android工程名稱上點擊右鍵,依次選擇“Android Tools” - “Export Unsigned Application Package ...”,然後選擇一個儲存位置儲存即可。這樣就得到了一個未經簽名的apk檔案。
3. 使用keytool工具產生數位憑證
keytool -genkey -v -keystore liufeng.keystore -alias liufeng.keystore -keyalg RSA -validity 20000
說明:
1)keytool是工具名稱,-genkey意味著執行的是產生數位憑證操作,-v表示將產生認證的詳細資料列印出來,顯示在dos視窗中;
2)-keystore liufeng.keystore 表示產生的數位憑證的檔案名稱為“liufeng.keystore”;
3)-alias liufeng.keystore 表示認證的別名為“liufeng.keystore”,當然可以不和上面的檔案名稱一樣;
4)-keyalg RSA 表示產生密鑰檔案所採用的演算法為RSA;
5)-validity 20000 表示該數位憑證的有效期間為20000天,意味著20000天之後該認證將失效
4. 使用jarsigner工具為Android應用程式簽名
jarsigner -verbose -keystore liufeng.keystore -signedjar notepad_signed.apk notepad.apk liufeng.keystore
說明:
1)jarsigner是工具名稱,-verbose表示將簽名過程中的詳細資料列印出來,顯示在dos視窗中;
2)-keystore liufeng.keystore 表示簽名所使用的數位憑證所在位置,這裡沒有寫路徑,表示在目前的目錄下;
3)-signedjar notepad_signed.apk notepad.apk 表示給notepad.apk檔案簽名,簽名後的檔案名稱為notepad_signed.apk;
4)最後面的liufeng.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版本升級,那麼將會出現上面那種程式不能覆蓋安裝的問題。不要小視這個問題,如果你開發的程式只有你自己使用,當然無所謂,卸載再安裝就可以了。但要是你的軟體有很多使用客戶,這就是大問題了,就相當於軟體不具備升級功能!
可以把上面這個完整的步驟寫成一個bat檔案,這樣需要簽名的時候只要運行這個bat就可以了。下面給出一個完整的bat檔案樣本:
@Rem android簽名程式 //注釋指令
@Rem echo是顯示指令 格式:echo [{on|off}] [message]
@echo **********************************************************
@Rem 檔案是否存在命令格式:if exist 路徑+檔案名稱 命令
@if exist d:sign/MyFirstApp.keystore goto sign
@echo 建立簽名檔案MyFirstApp.keystore
@Rem keytool命令格式:-genkey產生簽名 -alias別名 -keyalg密碼編譯演算法 -validity有效天數 -keystore生產簽名檔案名稱
keytool -genkey -alias MyFirstApp.keystore -keyalg RSA -validity 40000 -keystore MyFirstApp.keystore
@echo 開始簽名:
@Rem jarsigner命令格式:-verbose輸出詳細資料 -keystore密鑰庫位置 -signedjar要產生的檔案 要簽名的檔案 密鑰庫檔案
jarsigner -verbose -keystore MyFirstApp.keystore -signedjar MyFirstApp_signed.apk MyFirstApp.apk MyFirstApp.keystore
@goto over
:sign
@echo 開始簽名:
jarsigner -verbose -keystore MyFirstApp.keystore -signedjar MyFirstApp_signed.apk MyFirstApp.apk MyFirstApp.keystore
:over
@echo ********************MyFirstApp.apk 簽名完成************************
pause
簽名完成以後最好再把這個檔案壓縮一下,使用Android SDK安裝路徑下tools檔案夾裡的zipalign進行壓縮,以剛才這個檔案為例,也可以寫成一個bat檔案,樣本如下:
C:\soft\android-sdk-windows\tools\zipalign -f -v 4 MyFirstApp_signed.apk MyFirstApp_zip.apk
C:\soft\android-sdk-windows\tools\zipalign -c -v 4 MyFirstApp_zip.apk
pause