編輯:Android開發實例
Android 要求所有應用在安裝前必須使用證書進行數字簽名。Android 使用該證書來確定一個應用以及其作者身份,該證書不要求由證書發行機構頒發,因此 Android 應用經常使用自我簽名的證書,而開發者保管證書的私鑰。
你可以使用調試和發行兩種模式進行簽名。在調試模式下 Android SDK 負責自動生成證書並對應用簽名,在發行模式下你需要自行生成屬於你自己的證書。
在該模式下,Android SDK 會自動生成一個調試用的證書,並且使用默認密碼對應用進行簽名,因此當你需要調試你的應用程序時,構建過程無需輸入任何密碼。
Android Studio 和 Eclipse + ADT 在調試模式下能自動對應用進行簽名。
你可以通過 USB 連接到你的安卓設備來調試你的應用,但調試模式簽名的應用無法用於公開發行。
在該模式下,你使用自己的證書對應用進行簽名:
1. 創建 keystore。keystore 是指一個二進制文件,它包含了一系列私鑰。你需要將你的 keystore 保存在一個安全可靠的地方。
2. 創建私鑰。私鑰代表著可以確認應用身份的實體,例如某個人或者公司。
3. 構建項目。生成一個未簽名的 .apk。
4. 應用簽名。使用你的私鑰對未簽名的 .apk 進行簽名。
完成以上四個步驟後,你就可以在 Google Play 上發行你的應用了[1]。
在應用的整個生命周期,你都需要使用相同的證書對其進行簽名,因為:
● 升級:當安卓系統對一個應用進行更新安裝時,會首先比較新舊兩個版本的證書,只有二者吻合系統才允許升級。如果在新版本應用中你使用了新的證書,你必須重新命名你的包名,那麼對用戶而言,他們其實是安裝了另外一個應用。
● 模塊性:安卓系統允許具有相同證書簽名的應用在同一個進程中運行,對系統而言它們是同一個應用。這樣的話你就可以按模塊部署你的應用,用戶可以獨立升級各個模塊。
● 按權限分享代碼和數據:安卓系統提供了一套基於簽名的權限管理系統,因此當一個應用使用了特定的證書簽名,那麼另一個應用就可以為其提供指定的功能支持。通過這套權限管理系統和對多個應用使用相同證書簽名,你的應用就可以安全的共享代碼和數據。
如果你想要對應用進行後續升級,你就必須保證證書的有效期大於應用的生命周期。一般推薦有效期為 25 年或者更長。一旦你的密鑰過期,用戶將無法順利升級你的應用。
如果你想要在 Google Play 上發行你的應用,你用以簽名應用的密鑰有效期必須超過 2033 年 10 月 22 日。這是 Google Play 為了保證用戶可以順利升級他們的應用而采取的強制措施。
安全妥善的保管你的私鑰,無論對你還是用戶都是非常重要的。如果你允許其他人使用你的密鑰,或者將 keystore 和密碼保管在一個不安全的地方,那將危害你作為應用所有者身份的認定以及用戶的信任。
如果其他人設法在你不知情或未許可的情況下獲取了你的密鑰,那他就可以惡意發行應用來取代你的應用。他還可以以你的名義攻擊其他應用或者系統,盜取用戶數據。
你的應用未來所有版本都將使用你的私鑰進行簽名。如果你丟失私鑰,你將無法對已發行應用推送更新,你也不能重新生成私鑰。
你作為一名開發者的聲譽取決於你是否妥善保管你的密鑰,以下是保障密鑰安全的幾個建議:
● 為 keystore 和密鑰設置一個健壯的密碼。
● 不把私鑰交給其他任何人,不告訴任何未授權的人你的 keystore 和私鑰密碼。
● 將 keystore 和私鑰文件保管在一個安全可靠的地方。
一般來說,只要在生成、使用和保管密鑰時遵循一個普世安全意識,那麼一切就都是安全的。
調試模式使用的證書有效期為 365 天,當證書過期時,你會得到一個構建錯誤。
要修復這個問題只要刪除 debug.keystore 文件即可。該文件默認保存路徑為 ~/.android/ (OS X 或 Linux)或者 C:\Documents and Settings\<user>\.android\ (Windows XP),或 C:\Users\<user>\.android\ (Windows Vista 和 Windows 7)。
在你下次構建時,構建工具會自動生成一個新的 keystore 和調試密鑰[2]。
你可以使用 Android SDK 和 JDK 提供的標准工具來手動簽名你的應用。以下演示如何在命令行以發行模式進行簽名:
1. 使用 keytool 工具(由 JDK 提供)生成私鑰:
$ keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
以上示例會要求你輸入 keystore 和私鑰密碼,並要求輸入一些個人信息,最後生成一個名為 my-release-key.keystore 的文件。這個 keystore 包含一個私鑰,有效期為 10000 天。-alias 選項提供的別名在稍後簽名應用時會用到。
2. 在發行模式下編譯一個未簽名的 .apk。
3. 使用 jarsigner 工具(由 JDK 提供) + 私鑰來簽名應用:
$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name
以上示例會要求輸入 keystore 和私鑰密碼,它會修改 APK 文件以完成簽名。你可以使用不同的密鑰對 APK 文件進行多次簽名。
4. 確認 APK 是否已簽名:
$ jarsigner -verify -verbose -certs my_application.apk
5. 使用 zipalign 工具(由 Android SDK 提供)調整最終的 APK 包:
$ zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk
zipalign 工具確保所有未壓縮的數據都以一個特別的字節開始,使其與文件起始點保持相對整齊。這樣可以減少應用的 RAM 占有率。
注:
[1] 你應該將 keystore 和私鑰保存在一個安全可靠的地方,同時保管一份安全的備份。如果你丟失了它們,你將無法在 Google Play 上更新你的應用,因此你必須使用相同的密鑰來簽名同一個應用的所有版本。
[2] 如果你的開發環境不是使用公歷紀年(准確說是格裡高利歷),構建工具可能會錯誤地生成一個已經過期的調試證書,從而導致無法編譯應用。要解決這個問題,參見 I can't compile my app because the build tools generated an expired debug certificate。
附:
1. Signing Your Applications
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
本文實例講述了Android中ListView下拉刷新的實現方法。分享給大家供大家參考,具體如下: ListView中的下拉刷新是非常常見的,也是經常使用的,看
本文實例講述了Android編程之SurfaceView學習示例。分享給大家供大家參考,具體如下: SurfaceView是View的子類,使用的方式與任何Vie
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用