Android應用程序簽名(官方文檔中文版)(上)

概覽

Android要求全部已安裝的應用程序都使用數字證書作數字簽名, 數字證書的私鑰由應用開發者持有. Android使用證書做爲標識應用程序做者的一種方式, 並在應用程序之間創建信任關係. 證書並不用來控制用戶可否安裝哪一個應用. 證書不須要由證書認證中心簽名: 徹底可使用自簽名證書(self-signed certificates). android

理解Android應用簽名的要點有: 安全

  • 全部應用程序都必須簽名. 系統將不會安裝一個沒簽名的應用.
  • 能夠用自簽名證書來簽名應用程序. 並不須要證書認證中心.
  • 當準備好向最終用戶發佈應用時, 必須用一個合適的私鑰對其簽名. 不能發佈用SDK工具生成的debug key簽名的應用.
  • 系統僅在安裝時檢查簽名者的證書的過時時間. 若是應用程序簽名者的證書在安裝後的時間過時, 該應用將仍然正常工做.
  • 可使用標準工具 — Keytool 和 Jarsigner — 生成key併爲應用的 .apk 文件簽名.
  • 當應用簽名完成, 使用 zipalign 工具來優化最終的 APK 包.

沒有正確簽名的應用, Android系統不會安裝或運行. 此規則適用於在任何地方運行的Android系統, 不論是在模擬器仍是真實設備上. 由於這個緣由, 在真機或模擬器上運行或者調試應用前, 必須爲其設置好籤名. 服務器

在調試期間, Androi SDK工具協助你爲應用作好籤名工做. Eclipse的ADT插件和Ant build工具都提供2種簽名模式 – debug 模式和 release 模式. app

  • 開發和調試的時候, 可在debug模式下編譯. 在debug模式下, build工具使用Keytool工具, 它被包含在JDK中, 用於建立一個keystore和key, 別名和密碼. 在每一個編譯過程當中, 工具使用debug key來簽名應用的.apk文件. 由於事先知道密碼, 因此在每一次編譯keystore/key須要密碼的時候不會提示.
  • 當應用準備好發佈時, 必須在release模式下編譯,而後用你的私鑰對.apk文件簽名.
  • 有2種方法:
    • 在命令行下使用 Keytool 和 Jarsigner.
    • 使用此方法, 首先須要將應用編譯成一個未簽名的 .apk . 而後必須手動使用Jarsigner(或相似工具)和你的私鑰爲.apk簽名. 若是沒有合適的私鑰, 能夠手動運行Keytool來生成你本身的 keystore/key ,而後用Jarsigner給應用簽名.
    • 使用ADT的Export Wizard.
    • 若是在Eclipse下使用ADT插件開發, 可使用Export Wizard來編譯應用, 生成私鑰(若是有必要), 以及爲.apk簽名, 使用Export Wizard能夠簡單地在幾個步驟中完成全部的事情.

一旦應用完成簽名, 不要忘了爲APK運行zipalign來完成額外的優化. 模塊化

簽名策略

應用程序簽名的一些方面可能會影響應用程序的開發過程, 尤爲是當你計劃發佈多個應用時. 一般狀況下, 對於全部開發者而言, 推薦的策略是:在應用程序的整個生命週期,全部的應用程序使用相同的證書籤名. 工具

爲何這麼作的緣由: 優化

  • 應用程序升級 – 當發佈應用的更新時, 若是想讓用戶無縫地升級到新版本, 須要繼續使用相同的某個或者某一套證書來簽名更新包. 當系統安裝應用的更新時, 它會比較現有版本和新版本的證書. 若是證書吻合, 包括證書數據和順序都吻合, 那麼系統容許更新. 若是新版本所作的簽名不是匹配的, 那麼將須要給應用起一個不一樣的包名 — 在這種狀況下, 用戶至關於安裝了一個徹底的新程序.
  • 應用程序模塊化 – Android容許由相同證書籤名的應用程序運行在相同的進程中, 此時系統會將它們做爲單個應用程序對待. 在這種方式中, 能夠按模塊化的方式部署應用, 用戶能夠根據須要獨立地更新每個模塊.
  • 代碼/數據 的受權共享 – Android 提供模式匹配的權限控制機制, 所以一個應用能夠暴露功能給另外一個用指定證書籤名的應用. 經過用相同證書籤名多個應用,以及使用模式匹配的權限檢查, 應用程序能夠以安全的方式共享代碼和數據.

另外一個影響簽名策略的重要考量是, 如何設置簽名應用的key的有效期. ui

  • 若是計劃爲某個單獨的應用程序提供更新支持, 那麼應該確認key的有效期要比應用的壽命長. 推薦25年或者更長的有效期. 當key的有效期過時, 用戶將不再能無縫地更新到應用程序的新版本.
  • 若是要使用相同的key爲多個不一樣的應用簽名, 應當確認key的有效期比全部這些應用的全部版本的生命週期還長, 包括要比未來加到這個套件中的額外的關聯應用的生命週期更長.
  • 若是計劃將應用程序發佈到Android Market, 爲應用簽名的key的有效期必須在2033年10月22日之後. Market服務器強制執行這個規則, 來保證當新版本可用時, 用戶能夠無縫地更新Market應用.

當設計的時候, 須牢記這些要點, 以確保使用合適的證書來簽名應用程序. spa

簽名基礎設置.

在開始以前, 應當確保Keytool對 SDK build tools 可用. 在大多數狀況下, 咱們能夠經過設置JAVA_HOME環境變量來引用一個合適的JDK, 告訴SDK build tools如何找到Keytool. 或者, 能夠添加 Keytool的JDK版本到 PATH 環境變量. 插件

若是在某個自帶GNU Java編譯器版本的Linux下開發, 請確認系統使用的是JDK版本的Keytool, 而不是 gcj 版本. 若是 Keytool 已經存在於 PATH, 它可能會指向一個 /usr/bin/keytool 的符號連接. 在這種狀況下, 檢查符號連接目標, 確保它指向JDK中的Keytool.

若是將公開發布應用程序, 還須要 Jarsigner 工具. Jarsigner 和 Keytool 都包含在 JDK 中.

Debug模式下的簽名

Android build tools 提供了debug簽名模式, 幫助簡化應用的開發和調試, 而仍然符合Android系統簽名.apk的需求. 當使用debug模式來構建app時, SDK 工具調用 Keytool來自動建立一個用於debug的 keystore 和 key. 而後這個debug key被用來自動簽名 .apk, 因此沒必要用本身的key來簽名包.

SDK 工具使用預約義的 名稱/密碼 來建立keystore/key :

  • Keystore name: "debug.keystore"
  • Keystore password: "android"
  • Key alias: "androiddebugkey"
  • Key password: "android"
  • CN: "CN=Android Debug,O=Android,C=US"

若有必要, 能夠更改 debug keystore/key 的 location/name 或本身提供一個自定義的 debug keystore/key. 然而, 任何自定義的debug keystore/key必須使用和默認debug key(如以前所述)相同的debug keystore/key 名稱和密碼. (Eclipse/ADT中, Windows > Preferences > Android > Build)

注意: 當用debug證書籤名時, 應用程序不能對外發布.

Eclipse用戶

若是使用 Eclipse/ADT (而且根據以前"簽名基礎設置"一節所述設置好了Keytool), debug模式下的簽名是默認開啓的. 運行或者調試程序時, ADT自動使用debug證書對.apk進行簽名, 並對安裝包使用zipalign, 而後將它安裝到選定的模擬器或者鏈接的設備上. 這一切不用咱們親自動手, ADT能夠自行訪問Keytool.

Ant用戶

若是使用Ant來構建.apk文件, debug簽名模式經過ant命令(假設使用由android tool生成的build.xml文件)下使用debug選項開啓. 當運行ant debug來編譯app時, build腳本生成一個 keystore/key 併爲.apk作簽名. 而後腳本也會使用zipalign工具優化.apk. 仍然不須要你作額外的事情.

相關文章
相關標籤/搜索