Android APK簽名原理和過程詳解

faisky的部落格發表於2014-11-23

在Android 系統中,所有安裝 到 系統的應用程式都必有一個數字證照,此數字證照用於標識應用程式的作者和在應用程式之間建立信任關係,如果一個 permission的protectionLevel為signature,那麼就只有那些跟該permission所在的程式擁有同一個數字證照的應 用程式才能取得該許可權。Android使用Java的數字證照相關的機制來 給apk加蓋數字證照,要理解android的數字證照,需要先了解以下數字證照的概念和java的數字證照機制。Android系統要求每一個安裝進系 統的應用程式都是經過數字證照籤名的,數字證照的私鑰則儲存在程式開發者的手中。Android將數字證照用來標識應用程式的作者和在應用程式之間建立信 任關係,不是用來決定終端使用者可以安裝哪些應用程式。這個數字證照並不需要權威的數字證照籤名機構認證,它只是用來讓應用程式包自我認證的。

一:同一個開發者的多個程式儘可能使用同一個數字證照 ,這可以帶來以下好處。

(1)有利於程式升級,當新版程式和舊版程式的數字證照相同時,Android系統才會認為這兩個程式是同一個程式的不同版本。如果新版程式和舊版程式的數字證照不相同,則Android系統認為他們是不同的程式,併產生衝突,會要求新程式更改包名。

(2)有利於程式的模組化設計和開發。Android系統允許擁有同一個數字簽名的程式執行在一個程式中,Android程式會將他們視為同一個程式。所以開發者可以將自己的程式分模組開發,而使用者只需要在需要的時候下載適當的模組。

(3) 可以通過許可權(permission)的方式在多個程式間共享資料和程式碼。Android提供了基於數字證照的許可權賦予機制,應用程式可以和其他的程式共 享概功能或者資料給那那些與自己擁有相同數字證照的程式。如果某個許可權(permission)的protectionLevel是signature, 則這個許可權就只能授予那些跟該許可權所在的包擁有同一個數字證照的程式。

在簽名時,需要考慮數字證照的有效期 :

(1)數字證照的有效期要包含程式的預計生命週期,一旦數字證照失效,持有改數字證照的程式將不能正常升級。

(2)如果多個程式使用同一個數字證照,則該數字證照的有效期要包含所有程式的預計生命週期。

(3)Android Market強制要求所有應用程式數字證照的有效期要持續到2033年10月22日以後。

二:Android數字證照包含以下幾個要點:

(1)所有的應用程式都必須有數字證照 ,Android系統不會安裝一個沒有數字證照的應用程式

(2)Android程式包使用的數字證照可以是自簽名的,不需要一個權威的數字證照機構簽名認證

(3)如果要正式釋出 一個Android ,必須使用一個合適的私鑰生成的數字證照來給程式簽名 ,而不能使用adt外掛 或者ant工具 生成的除錯證照來發布。

(4)數字證照都是有有效期 的,Android只是在應用程式安裝的時候才會檢查證照的有效期。如果程式已經安裝在系統中,即使證照過期也不會影響程式的正常功能。

(5)Android使用標準的java工具 Keytool and Jarsigner 來生成數字證照,並給應用程式包簽名。

(6)使用zipalign 優化 程式。

Android 系統不會安裝執行任何一款未經數字簽名的apk程式,無論是在模擬器上還是在實際的物理裝置上。Android的開發工具(ADT外掛和Ant)都可以協 助開發者給apk程式簽名,它們都有兩種模式:除錯模式(debug mode)和釋出模式(release mode)。

在除錯模式下,android的開發工具會在每次編譯時使用除錯用的數字證照給程式簽名,開發者無須關心。

當要釋出程式時,開發者就需要使用自己的數字證照給apk包簽名,可以有兩種方法。

(1)在命令列下使用JDK中的和Keytool(用於生成數字證照)和Jarsigner(用於使用數字證照籤名)來給apk包簽名。

(2)使用ADT Export Wizard進行簽名(如果沒有數字證照可能需要生成數字證照)。

三;兩種簽名方式

第一種簽名方式, 使用Keytool和Jarsigner給程式簽名( 用於1.5以下版本 )

命令:keytool -genkey -v -keystore android.keystore -alias android -keyalg RSA -validity 20000

該 命令中,-keystore ophone.keystore 表示生成的證照,可以加上路徑(預設在使用者主目錄下);-alias ophone 表示證照的別名是ophone;-keyalg RSA 表示採用的RSA演算法;-validity 20000表示證照的有效期是20000天。

此時,我們會在互用主目錄下看到ophone.keystore,即我們剛剛建立的證照。

第二種簽名方式:現在介紹android 1.5及更新版本的apk簽名方式

1,開啟Eclipse->選擇你要簽名的專案->右擊->android tools->Export signed Application package…

2,跳出視窗

3,project checks 如果核對專案名沒有問題的話 點選 Next

然後跳出keystore selection 如果是已經存在keystore的檔案就選擇然後next 輸入keystore的密碼進行簽名。
如果沒有的話選擇 create new keystore 然後選擇 keystore 儲存的位置,設定keystore的密碼,點選Next。

4.填寫keystore的基本資訊,如,別名,密碼,有效期,姓名,組織,組織名稱,所在城市,所在省份,國家等,點選Next

5.選擇被簽名後的APK儲存位置。點選finish。

6.就可以在你儲存的位置中找到相應的被簽名後的APK檔案。

相關文章