簽署應用程式

Android 要求所有 APK 都必須經過數位憑證簽署,才能安裝到裝置上或進行更新。使用 Android App Bundle 發布時,您必須使用上傳金鑰簽署您的應用程式套件,然後再上傳到 Play 管理中心,Play 應用程式簽署計畫會負責處理休息 如果應用程式是在 Play 商店 (適用於 2021 年 8 月前建立的應用程式) 或其他商店採用 APK 形式發布,則必須手動簽署 APK 才能上傳。

本頁會介紹一些與應用程式簽署和安全性相關的重要概念、如何透過 Android Studio 簽署應用程式以發布至 Google Play,以及如何設定 Play 應用程式簽署功能。

以下簡要概略說明簽署新應用程式並發布至 Google Play 時必須採取的步驟:

  1. 產生上傳金鑰和 KeyStore
  2. 使用上傳金鑰簽署應用程式
  3. 設定 Play 應用程式簽署功能
  4. 將應用程式上傳到 Google Play
  5. 準備及推出應用程式版本

如果您的應用程式已使用現有的應用程式簽署金鑰發布到 Google Play 商店,或者您想為新應用程式選擇應用程式簽署金鑰,而非由 Google 產生,請按照下列步驟操作:

  1. 使用應用程式的「簽署金鑰」簽署應用程式,並選取加密及匯出簽署金鑰的選項。
  2. 上傳應用程式的簽署金鑰到 Play 應用程式簽署功能。
  3. (建議) 產生並註冊上傳憑證,以便日後更新應用程式
  4. 將應用程式上傳到 Google Play
  5. 準備及推出應用程式版本

此外,本頁也會說明如何管理您的金鑰,以便在將應用程式上傳至其他應用程式商店時使用。如果您未使用 Android Studio,或希望透過指令列簽署應用程式,請參閱 apksigner 的使用方式。

Play 應用程式簽署

只要您使用 Play 應用程式簽署功能,Google 就會為您管理及保護應用程式的簽署金鑰,並使用該金鑰簽署您要發布的 APK。此外,由於應用程式套件會延遲建立 Google Play 商店簽署及簽署 APK,因此您必須設定 Play 應用程式簽署功能,然後再上傳應用程式套件。這麼做的好處如下:

  • 使用 Android App Bundle,並支援 Google Play 的進階傳送模式。 除了採用 Android App Bundle 外,開發人員也能縮減應用程式發布速度,並輕鬆使用功能模組及提供免安裝體驗。
  • 提高簽署金鑰的安全性,並利用單獨的上傳金鑰簽署您上傳至 Google Play 的應用程式套件。
  • 如果現有的金鑰遭駭,或是您必須遷移至加密強度更高的金鑰,可透過為新安裝檔提供的一次性金鑰升級來變更應用程式簽署金鑰。

Play 應用程式簽署功能會使用到兩種金鑰:「應用程式簽署金鑰」和「上傳金鑰」。如要進一步瞭解詳情,請參閱「金鑰和 KeyStore」一節。您保留上傳金鑰,並使用金鑰簽署您的應用程式,以便上傳至 Google Play 商店。接著,Google 會使用上傳憑證驗證您的身分,並使用您的應用程式簽署金鑰簽署您的 APK 以進行發布,如圖 1 所示。如果使用單獨的上傳金鑰,您可以在金鑰遺失或遭駭時要求重設上傳金鑰

相較之下,如果應用程式在 2021 年 8 月前建立但尚未採用 Play 應用程式簽署功能,您一旦遺失應用程式的簽署金鑰,就無法更新應用程式。

圖 1. 使用 Play 應用程式簽署功能簽署應用程式

您的金鑰會儲存在 Google 用來儲存自身金鑰的基礎架構中,因此這些金鑰受到 Google 金鑰管理服務的保護。如要進一步瞭解 Google 的技術基礎架構,請參閱 Google Cloud 安全性白皮書

使用 Play 應用程式簽署功能時,如果上傳金鑰遺失或遭駭,您可以向 Google 要求撤銷舊的上傳金鑰,並產生新的金鑰。您的應用程式簽署金鑰受到 Google 的保護,因此即使變更上傳金鑰,您仍可繼續以原始應用程式更新的形式上傳新版應用程式。詳情請參閱重設遺失或遭駭的私人上傳金鑰

下一節將說明與應用程式簽署和安全性相關的重要詞彙和概念。如果您想略過這個部分,直接瞭解如何準備將應用程式上傳到 Google Play 商店,請參閱簽署要發布的應用程式一節。

KeyStore、金鑰和憑證

Java KeyStore (.jks 或 .keystore) 是二進位檔案,用來當做憑證和私密金鑰的存放區。

公用金鑰憑證 (.der.pem 檔案) 又稱為數位憑證或識別憑證,其中包含公開/私密金鑰組的公開金鑰,以及某些可辨識對應私密金鑰擁有者身分的中繼資料 (例如名稱和位置)。

以下是您應瞭解的各種金鑰類型:

  • 應用程式簽署金鑰:這個金鑰是用來簽署使用者裝置上安裝的 APK。簽署金鑰為 Android 安全更新模型的一部分,在應用程式的生命週期內會保持不變。應用程式簽署金鑰屬於私密金鑰,因此不得公開。不過,您可以將使用應用程式簽署金鑰產生的憑證分享給別人。
  • 上傳金鑰:在上傳應用程式套件或 APK 以透過 Google Play 簽署應用程式之前,您可以使用上傳金鑰簽署應用程式套件或 APK。請務必保留上傳金鑰的密鑰。不過,您可以分享使用上傳金鑰產生的憑證。產生上傳金鑰的方式如下:

    • 如果您在加入計畫時選擇讓 Google 為您產生應用程式簽署金鑰,系統就會將您簽署應用程式以進行發布時所使用的金鑰指定為上傳金鑰。
    • 如果您在將全新或現有應用程式加入計畫時向 Google 提供應用程式簽署金鑰,可以選擇在加入過程中或加入後產生新的上傳金鑰,以提升安全性。
    • 如果您選擇不產生新的上傳金鑰,可繼續將應用程式簽署金鑰當做上傳金鑰,用於簽署各個版本。

    建議: 為了保障金鑰的安全,建議您確保應用程式簽署金鑰和上傳金鑰為不同的金鑰。

與 API 供應商合作

您可以前往 Play 管理中心的「版本 > 設定 > 應用程式完整性」頁面下載應用程式簽署金鑰和上傳金鑰。用於向 API 供應商註冊公開金鑰;共用對像不包含私密金鑰。

簡短又獨特的憑證指紋可代表憑證。API 供應商通常會要求同時提供憑證指紋和套件名稱,以註冊使用其服務的應用程式。您可以在 Play 管理中心的「應用程式簽署」頁面找到上傳憑證和應用程式簽署憑證的 MD5、SHA-1 和 SHA-256 指紋;透過在此頁面中下載原始憑證 (.der),也可計算出其他指紋。

簽署偵錯版本

您在 IDE 執行或偵錯專案時,Android Studio 會自動使用 Android SDK 工具產生的偵錯憑證來簽署您的應用程式。當您第一次在 Android Studio 中執行或偵錯專案時,IDE 會在 $HOME/.android/debug.keystore 中自動建立偵錯 KeyStore 和憑證,並設定 KeyStore 和金鑰密碼。

由於偵錯憑證是由建構工具所建立,在設計上並不安全,因此多數應用程式商店 (包括 Google Play 商店) 都不會接受以偵錯憑證簽署要發布的應用程式。

Android Studio 會將偵錯簽署資訊自動儲存在簽署設定中,因此您不必在每次偵錯時輸入資訊。簽署設定是一個物件,包含簽署應用程式所需的所有必要資訊,包括 KeyStore 位置、KeyStore 密碼、金鑰名稱和金鑰密碼。

如要進一步瞭解如何建構及執行偵錯應用程式,請參閱「建立並執行應用程式」一文。

偵錯憑證過期

如果自行簽署憑證用於簽署偵錯應用程式,該憑證有效期為 30 年,自建立日期起計算。憑證到期時,您會收到建構錯誤。

如要修正這個問題,只需刪除下列其中一個位置儲存的 debug.keystore 檔案:

  • ~/.android/ (OS X 和 Linux)
  • C:\Documents and Settings\user\.android\ on Windows XP
  • C:\Users\user\.android\ Windows Vista 和 Windows 7、8 和 10

當您下次執行 偵錯版本時,Android Studio 會產生新的 KeyStore 和偵錯金鑰。

簽署應用程式以發布至 Google Play

當您準備好發布應用程式時,請先簽署應用程式並上傳到 Google Play。首次將應用程式發布到 Google Play 時,您必須一併設定 Play 應用程式簽署功能。對於 2021 年 8 月前建立的應用程式,Play 應用程式簽署功能是選用項目。本節說明如何妥善簽署應用程式以進行發布,並設定 Play 應用程式簽署功能。

產生上傳金鑰和 KeyStore

如果您沒有設定上傳金鑰 (適合設定 Play 應用程式簽署功能),則可使用 Android Studio 產生一個金鑰,如下所示:

  1. 在選單列中,依序按一下「Build」>「Generate Signed Bundle/APK」
  2. 在「Generate Signed Bundle or APK」對話方塊中,選取「Android App Bundle」或「APK」,然後按一下「Next」
  3. 在「Key store path」欄位下方,按一下「Create new」
  4. 在「New Key Store」視窗中,為您的 KeyStore 和金鑰提供以下資訊 (如圖 2 所示)。

    圖 2. 在 Android Studio 中建立新的上傳金鑰和 KeyStore。

  5. 金鑰庫

    • 金鑰存放區路徑:選取建立 KeyStore 的位置。此外,如果副檔名為 .jks,則應在檔案名稱路徑的結尾加上檔案名稱。
    • 密碼:為金鑰庫建立並確認安全密碼。
  6. 金鑰

    • 別名:輸入金鑰的專屬名稱。
    • Password (密碼):為金鑰建立並確認安全的密碼。這組金鑰應與您的 KeyStore 密碼相同。(詳情請參閱已知問題)
    • 效期 (年):設定金鑰生效的時間長度 (單位為年)。金鑰的有效期限應至少為 25 年,以便在應用程式的整個生命週期內使用同一個金鑰簽署應用程式更新。
    • Certificate:輸入憑證的相關資訊。這項資訊不會顯示在應用程式中,但會納入您的 APK 中的憑證。
  7. 填妥表單後,按一下「OK」

  8. 如要使用上傳金鑰建構並簽署應用程式,請參閱下方的使用上傳金鑰簽署應用程式一節。如果您只想產生金鑰和 KeyStore,請按一下「Cancel」

使用金鑰簽署應用程式

如果您已擁有上傳金鑰,請使用該金鑰簽署應用程式。如果應用程式已使用現有的應用程式簽署金鑰完成簽署並發布至 Google Play 商店,請使用該金鑰簽署您的應用程式,並確保將該金鑰加密並匯出,以選擇將應用程式加入 Play 應用程式簽署計畫。您可以稍後再產生獨立的上傳金鑰,並向 Google Play 註冊上傳金鑰的公開憑證,以便簽署及上傳後續的應用程式更新。

如要使用 Android Studio 簽署您的應用程式,並匯出現有的應用程式簽署金鑰,請按照下列步驟操作:

  1. 如果您目前沒有開啟「Generate Signed Bundle or APK」對話方塊,請按一下「Build」>「Generate Signed Bundle/APK」
  2. 在「Generate Signed Bundle or APK」對話方塊中,選取「Android App Bundle」或「APK」,然後按一下「Next」
  3. 從下拉式選單中選取所需模組。
  4. 指定 KeyStore 的路徑、金鑰的別名,以及兩者的密碼。如果您尚未備妥上傳 KeyStore 和金鑰,請先產生上傳金鑰和 KeyStore,然後再返回完成這個步驟。

    圖 3. 使用上傳金鑰簽署應用程式。

  5. 如果您使用現有的應用程式簽署金鑰來簽署應用程式套件,並且想稍後再選擇將應用程式加入 Play 應用程式簽署計畫,請勾選「Export encrypted key」旁的方塊,並指定將簽署金鑰儲存為加密 *.pepk 檔案的路徑。接著,您就可以使用加密的應用程式簽署金鑰將現有應用程式加入 Play 應用程式簽署計畫

  6. 按一下「Next」

  7. 在下一個視窗中 (如圖 4 所示),為已簽署的應用程式選取目標資料夾和建構類型,然後選擇變種版本 (如果適用的話)。

  8. 如果您要建構並簽署 APK,必須選取要讓應用程式支援的簽章版本。詳情請參閱應用程式簽署配置

  9. 按一下「Finish」

    圖 4. 依據所選產品口味產生應用程式的已簽署版本。

圖 5. 按一下彈出式視窗中的連結,即可分析或尋找應用程式套件,或是找出匯出的簽署金鑰。

Android Studio 完成建構已簽署的應用程式後,您可以在彈出式通知中按一下適當選項,以找出分析應用程式。如果您選取了匯出簽署金鑰的選項,只要按一下彈出式視窗右下角的下拉式箭頭來展開選單,並按一下「Show Exported Key File」,即可快速前往查看匯出的金鑰 (如圖 5 所示)。

您現在可選擇將應用程式加入 Play 應用程式簽署計畫,並上傳應用程式以進行發布。如果您還不熟悉應用程式的發布程序,請參閱發布總覽頁面。如果沒有相關疑問,請繼續前往「將應用程式上傳至 Play 管理中心」說明頁面。

使用 Play 應用程式簽署功能

如本頁先前所述,您必須設定 Play 應用程式簽署功能,才能簽署您的應用程式並透過 Google Play 發布。不過,這不包括在 2021 年 8 月前建立的應用程式,這類應用程式可繼續發布自行簽署的 APK。您需要採取的步驟取決於應用程式是否尚未在 Google Play 上發布,或者您的應用程式是否已在 2021 年 8 月前使用現有的應用程式簽署金鑰完成簽署並發布。

設定新的應用程式

如要設定尚未發布至 Google Play 的應用程式簽署程序,請按照下列步驟操作:

  1. 產生上傳金鑰,然後使用該上傳金鑰簽署應用程式 (如果您還沒完成這項操作的話)。
  2. 登入 Play 管理中心
  3. 按照步驟準備及推出版本來建立新版本。
  4. 選擇發布途徑後,請在「應用程式完整性」區段設定應用程式簽署,如下所示:
    • 如要讓 Google Play 產生應用程式簽署金鑰並使用該金鑰簽署應用程式,則不必執行任何操作。您用於簽署第一個版本的金鑰會成為您的上傳金鑰,而日後的版本也應使用這個金鑰完成簽署。
    • 如要使用與您的開發人員帳戶中其他應用程式相同的金鑰,請依序選取「Change app signing key」>「Use my own key」>「Use the same key as another app in this account」、選取一個應用程式,接著點選「Continue」
    • 如要提供您自己的簽署金鑰讓 Google 簽署應用程式,請依序選取「Change app signing key」>「Use my own key」,然後選取其中一個可安全上傳私密金鑰及其公開憑證的選項。

在「App Bundles」中按一下「Browse files」,然後找出並上傳您使用上傳金鑰簽署的應用程式。如要進一步瞭解如何發布應用程式,請參閱「準備及推出版本」。設定 Play 應用程式簽署功能之後,當您發布應用程式時,Google Play 會為您產生 (除非您上傳現有金鑰) 及管理應用程式的簽署金鑰。您只要先使用應用程式的上傳金鑰簽署後續的應用程式更新,再將應用程式上傳到 Google Play 即可。

如果您需要為應用程式建立新的上傳金鑰,請參閱「重設遺失或遭到盜用的私密上傳金鑰」一節。

為現有應用程式選擇加入計畫

如要使用現有的應用程式簽署金鑰更新已發布至 Google Play 的應用程式,可以按照下列步驟加入 Play 應用程式簽署計畫:

  1. 透過 Android Studio 使用現有的應用程式簽署金鑰簽署應用程式,並確認已勾選「Export encrypted key」旁的方塊,將簽署金鑰儲存為加密的 *.pepk 檔案 (如果您還沒完成這項操作的話)。您會在後續步驟中使用這個檔案。您也可以透過 PEPK 工具 (可透過 Play 管理中心下載) 進行這項操作。
  2. 登入「Play 管理中心」,然後前往您的應用程式。
  3. 在左側選單中依序選取「Release」>「Setup」>「App integrity」
  4. 如果可以的話,請詳閱《服務條款》,並選取「接受」
  5. 根據您要上傳到 Google Play 的簽署金鑰,選擇最符合的選項,然後按照畫面顯示的操作說明進行。舉例來說,如果您已按照本頁說明使用 Android Studio 匯出應用程式的簽署金鑰,請選取「Upload a key exported from Android Studio」,然後上傳金鑰的 *.pepk 檔案。
  6. 按一下「Enroll」

畫面現在會顯示包含應用程式簽署和上傳憑證詳細資料的頁面。部署應用程式時,Google Play 會使用您現有的金鑰簽署您的應用程式。不過,Play 應用程式簽署計畫的重要優點之一,就是能將上傳成果至 Google Play 時使用的簽署金鑰與 Google Play 簽署對使用者發布的應用程式時使用的金鑰分開。因此,請考慮遵循下一節的步驟,產生並註冊單獨的上傳金鑰。

產生並註冊上傳憑證

當您要發布未使用上傳金鑰簽署的應用程式時,Google Play 管理中心會提供註冊上傳金鑰的選項,供日後發布應用程式更新時使用。您可以視需要選擇執行這項步驟,但還是建議您使用獨立的金鑰發布應用程式,而不是使用 Google Play 向使用者發布應用程式時所用的金鑰。這樣一來,Google 就能妥善保護您的簽署金鑰,而您也能選擇重設遺失或遭到盜用的私密上傳金鑰。本節將說明如何建立上傳金鑰、如何透過上傳金鑰產生上傳憑證,以及如何向 Google Play 註冊該憑證,以供日後發布應用程式更新時使用。

下表說明在 Play 管理中心看到註冊上傳憑證的選項:

  • 發布使用簽署金鑰簽署的新應用程式,然後選擇加入 Play 應用程式簽署計畫。
  • 如果您要發布的現有應用程式已選擇加入 Play 應用程式簽署計畫,但該組應用程式使用簽署金鑰進行簽署,

如果您不是要發布更新至已加入 Play 應用程式簽署計畫的現有應用程式,並想要註冊上傳憑證,請完成下列步驟並繼續閱讀「重設遺失或遭到盜用的私密上傳金鑰」一節。

如果您尚未產生上傳金鑰和 KeyStore,請先完成這項操作。

建立上傳金鑰和 KeyStore 後,您必須使用 keytool 從上傳金鑰產生公開憑證,所需指令如下:

$ keytool -export -rfc
  -keystore your-upload-keystore.jks
  -alias upload-alias
  -file output_upload_certificate.pem

現在您已取得上傳憑證,請在 Play 管理中心按照系統提示向 Google 註冊該憑證,或是參閱以下章節,瞭解如何透過 Google Play 支援團隊進行註冊。

升級應用程式簽署金鑰

在某些情況下,您可能想要變更應用程式的簽署金鑰。例如,您希望密碼編譯更強或金鑰遭駭。然而,只有當您使用相同簽署金鑰來簽署應用程式更新時,使用者才能更新您的應用程式,因此要為已發布的應用程式變更簽署金鑰並不容易。

將應用程式發布至 Google Play 時,即可透過 Play 管理中心為已發布的應用程式升級簽署金鑰。升級後,新的金鑰會用來簽署新推出的安裝檔和應用程式更新。假如使用者在金鑰升級之前就已經安裝應用程式,應用程式更新仍會使用舊的應用程式簽署金鑰進行簽署。

詳情請參閱「升級應用程式簽署金鑰並用於新推出的安裝檔」一節。

重設遺失或遭到盜用的私密上傳金鑰

如果您不慎遺失私密上傳金鑰,或者私密金鑰遭駭,可以建立新的金鑰並向 Google Play 支援團隊要求重設金鑰

設定建構程序,自動簽署您的應用程式

在 Android Studio 中,您可以建立簽署設定並指派給發布子版本類型,藉此將專案設定為在建構程序期間自動簽署應用程式的發布版本。簽署設定包含 KeyStore 位置、Keystore 密碼、金鑰別名和金鑰密碼。使用 Android Studio 建立簽署設定,並將其指派給版本建構類型,請完成下列步驟:

  1. 在「Project」視窗中,在應用程式上按一下滑鼠右鍵,然後點選「Open Module Settings」
  2. 在「Project Structure」視窗左側面板的「Modules」下方,按一下要簽署的模組。
  3. 按一下「Signing」分頁標籤後,按一下「Add」圖示
  4. 選取您的 KeyStore 檔案、輸入這個簽署設定的名稱 (因為您可以建立多項設定),並輸入必要資訊。

    圖 7. 用於建立新的簽署設定的視窗。

  5. 按一下「Build Types」分頁標籤。
  6. 按一下「release」版本。
  7. 在「Signing Config」底下,選取您剛建立的簽署設定。

    圖 8. 在 Android Studio 中選取簽署設定。

  8. 按一下「OK」

現在,每當您在 Android Studio 中透過「Build」>「Build Bundle(s) / APK(s)」底下的選項來建立發布子版本類型時,IDE 就會自動簽署應用程式,並使用您指定的簽署設定。您可以前往建構中模組的專案目錄,在 build/outputs/ 目錄中找到已簽署的 APK 或應用程式套件。

建立簽署設定時,系統會將您的簽署資訊包含在 Gradle 建構檔案中的純文字。如果您是透過團隊合作進行開發,或是要公開分享自己的程式碼,建議您將簽署資訊從建構檔案中移除並分開儲存,確保簽署資訊安全無虞。想進一步瞭解如何從建構檔案移除簽署資訊,請參閱「移除建構檔案中的簽署資訊」一節。如要進一步瞭解如何保護簽署資訊,請參閱保護金鑰

以不同方式簽署各項產品

如果您的應用程式使用各種產品變種版本,且您想以各種方式簽署各種變種版本,可以建立其他簽署設定,並依據變種版本指派不同的變種版本:

  1. 在「Project」視窗中,在應用程式上按一下滑鼠右鍵,然後點選「Open Module Settings」
  2. 在「Project Structure」視窗左側面板的「Modules」下方,按一下要簽署的模組。
  3. 按一下「Signing」分頁標籤後,按一下「Add」圖示
  4. 選取您的 KeyStore 檔案、輸入這個簽署設定的名稱 (因為您可以建立多項設定),並輸入必要資訊。

    圖 10. 用於建立新的簽署設定的視窗。

  5. 視需要重複步驟 3 和步驟 4,直到所有簽署設定建立完成。
  6. 按一下「Flavors」(變種版本) 分頁標籤。
  7. 按一下要設定的情境,然後從「簽署設定」「下拉式選單」中選取適當的簽署設定。

    圖 11. 依變種版本設定簽署設定。

    重複以上步驟,設定其他的變種版本。

  8. 按一下「OK」

您也可以在 Gradle 設定檔中指定簽署設定。詳情請參閱調整簽署設定

管理您的簽署金鑰

如果您選擇不加入 Play 應用程式簽署計畫 (僅適用於 2021 年 8 月前建立的應用程式),可以自行管理自己的應用程式簽署金鑰和 KeyStore。請注意,您必須負責保護金鑰和 KeyStore。此外,您的應用程式將不支援 Android App Bundle、Play Feature Delivery 和 Play Asset Delivery。

當您準備要建立自己的金鑰和 KeyStore 時,請務必先為 KeyStore 選擇高強度密碼,並為 KeyStore 中儲存的每個私密金鑰分別設定高強度密碼。您必須將 KeyStore 保存在安全的地方。如果您無法存取應用程式簽署金鑰,或是金鑰遭駭,Google 將無法為您找回應用程式簽署金鑰,而且您將無法以原始應用程式更新的形式向使用者發布應用程式的新版本。詳情請參閱下方的保護金鑰一節。

如果您自行管理應用程式簽署金鑰和 KeyStore,在簽署 APK 時,必須使用您的應用程式簽署金鑰在本機進行簽署,然後將已簽署的 APK 直接上傳至 Google Play 商店以進行發布 (如圖 10 所示)。

圖 12. 在您管理自己的應用程式簽署金鑰時簽署應用程式

當您使用 Play 應用程式簽署功能時,Google 會保護您的簽署金鑰,並確保應用程式經過正確簽署,同時能在生命週期內接收更新。不過,如果您決定自行管理應用程式簽署金鑰,請留意以下事項。

簽署注意事項

您必須在整個預期生命週期中使用相同的憑證簽署應用程式。可能的原因如下:

  • 應用程式升級:安裝應用程式更新時,系統會比對新版本與現有版本中的憑證。如果憑證相符,系統就會允許更新。如果您使用不同憑證簽署新版本,就必須為應用程式指派不同的套件名稱。在這種情況下,使用者會以全新應用程式的形式安裝這個新版本。
  • 應用程式模組化:Android 允許由相同憑證簽署的 APK 在同一程序中執行 (如果應用程式要求這麼做的話),因此系統會將 APK 視為單一應用程式。這樣一來,您就可以在模組中部署應用程式,使用者也能分別更新每個模組。
  • 透過權限分享程式碼/資料:Android 提供強制執行簽章式權限的機制,讓應用程式能夠將功能提供給使用特定憑證簽署的其他應用程式。使用同一憑證簽署多個 APK,並使用簽章式權限檢查功能,應用程式就能以安全的方式共用程式碼和資料。

如果您打算支援應用程式升級,請確認您的應用程式簽署金鑰有效期限超出該應用程式的預期生命週期。建議將效期設為 25 年以上。一旦超過金鑰的有效期限,使用者就無法順暢地升級至新版應用程式。

如果您打算在 Google Play 發布應用程式,用於簽署應用程式的金鑰有效期限必須晚於 2033 年 10 月 22 日。Google Play 會強制執行這項要求,以確保使用者可以在新版本發布時順暢升級應用程式。

保護金鑰安全

如果您選擇自行管理及保護應用程式簽署金鑰和 KeyStore,而不是選擇加入 Play 應用程式簽署計畫,保障應用程式簽署金鑰的安全對於您和使用者來說至關重要。如果您允許他人使用您的金鑰,或者將您的 KeyStore 和密碼存放在不安全的位置,以致第三方可找到並使用您的金鑰,就會損害您的授權身分以及使用者對您的信任。

如果第三方在您不知情或未經授權的情況下設法取得您的應用程式簽署金鑰,對方可能會簽署並發布應用程式,藉此惡意替換或毀損您的原版應用程式。此外,這類人士也可能會以您的身分簽署並發行應用程式,進而攻擊其他應用程式或系統本身,或者毀損或竊取使用者資料。

您必須使用私密金鑰才能簽署所有日後推出的應用程式版本。如果您遺失金鑰或保存不當,將無法發布現有應用程式的更新,也無法重新產生先前產生的金鑰。

您身為開發人員實體的聲譽取決於是否能確保應用程式簽署金鑰隨時都安全無虞,直到金鑰過期為止。以下是一些確保金鑰安全的提示:

  • 為 KeyStore 和金鑰選取高強度密碼。
  • 請勿將私密金鑰提供或借予他人,也不要讓未經授權人士知道您的 KeyStore 和金鑰密碼。
  • 將包含私密金鑰的 KeyStore 檔案保存在安全無虞的地方。

一般來說,如果您在產生、使用及儲存金鑰時採取通用的防範措施,就能保障金鑰安全。

移除建構檔案中的簽署資訊

建立簽署設定時,Android Studio 會將簽署資訊以純文字形式新增至模組的 build.gradle 檔案中。如果您與團隊合作或取得程式碼,請將這些機密資訊移出建構檔案,以免其他人員存取。為此,您應建立專屬的屬性檔案來儲存安全資訊,並在建構檔案中參照該檔案,方法如下:

  1. 建立簽署設定,並指派給一或多個建構類型。這些操作說明假設您已按照上述「設定可自動簽署應用程式的建構程序」一節中的說明,為發布子版本類型配置了單一簽署設定。
  2. 在專案的根目錄中建立名為 keystore.properties 的檔案。這個檔案應包含您的簽署資訊,如下所示:
    storePassword=myStorePassword
    keyPassword=mykeyPassword
    keyAlias=myKeyAlias
    storeFile=myStoreFileLocation
    
  3. 在模組的 build.gradle 檔案中,新增程式碼來載入 android {} 區塊之前的 keystore.properties 檔案。

    Groovy

    ...
    
    // Create a variable called keystorePropertiesFile, and initialize it to your
    // keystore.properties file, in the rootProject folder.
    def keystorePropertiesFile = rootProject.file("keystore.properties")
    
    // Initialize a new Properties() object called keystoreProperties.
    def keystoreProperties = new Properties()
    
    // Load your keystore.properties file into the keystoreProperties object.
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
    
    android {
        ...
    }
    

    Kotlin

    ...
    import java.util.Properties
    import java.io.FileInputStream
    
    // Create a variable called keystorePropertiesFile, and initialize it to your
    // keystore.properties file, in the rootProject folder.
    val keystorePropertiesFile = rootProject.file("keystore.properties")
    
    // Initialize a new Properties() object called keystoreProperties.
    val keystoreProperties = Properties()
    
    // Load your keystore.properties file into the keystoreProperties object.
    keystoreProperties.load(FileInputStream(keystorePropertiesFile))
    
    android {
        ...
    }
    

    注意事項:您可以選擇將 keystore.properties 檔案儲存在其他位置 (例如模組模組而非專案的根目錄資料夾,或位於)。在這種情況下,您應該修改上述程式碼,使用實際的 keystore.properties 檔案位置正確初始化 keystorePropertiesFile

  4. 您可以使用語法 keystoreProperties['propertyName'] 參照儲存在 keystoreProperties 中的屬性。 修改模組 build.gradle 檔案的 signingConfigs 區塊,藉此使用這個語法參照儲存在 keystoreProperties 中的簽署資訊。

    Groovy

    android {
        signingConfigs {
            config {
                keyAlias keystoreProperties['keyAlias']
                keyPassword keystoreProperties['keyPassword']
                storeFile file(keystoreProperties['storeFile'])
                storePassword keystoreProperties['storePassword']
            }
        }
        ...
      }

    Kotlin

    android {
        signingConfigs {
            getByName("config") {
                keyAlias = keystoreProperties["keyAlias"]
                keyPassword = keystoreProperties["keyPassword"]
                storeFile = file(keystoreProperties["storeFile"])
                storePassword = keystoreProperties["storePassword"]
            }
        }
        ...
      }
  5. 開啟「Build Variants」工具視窗,並確認已選取發布版本類型。
  6. 選取好「Build」>「Build Bundle(s) / APK(s)」底下的選項,以建立發布版本的 APK 或應用程式套件。您應該會在模組的 build/outputs/ 目錄中看到建構輸出內容。

建構檔案不再含有機密資訊,因此您現在可以在原始碼控管功能中加入這些檔案,或是將檔案上傳到共用的程式碼集。請務必妥善保存 keystore.properties 檔案。這可能包括從來源控制系統中移除。