簽署應用程式

Android 要求所有 APK 都必須經過數位憑證簽署,才能安裝到裝置上或進行更新。使用 Android App Bundle 發布程式時,您必須使用上傳金鑰簽署應用程式套件,然後再上傳到 Play 管理中心,然後 Play 應用程式簽署功能會完成其餘的流程。凡是在 Play 商店或其他商店以 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 所示。如果使用不同的上傳金鑰,您就可以在金鑰遺失或遭駭時要求重設上傳金鑰

相較之下,如果應用程式未採用 Play 應用程式簽署功能,您一旦遺失應用程式的簽署金鑰,就無法更新應用程式。

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

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

使用 Play 應用程式簽署功能時,如果上傳金鑰遺失或遭駭,您可以前往 Play 管理中心要求重設上傳金鑰。 您的應用程式簽署金鑰受到 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\ (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. 金鑰庫

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

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

  8. 如要使用上傳金鑰建構並簽署應用程式,請繼續閱讀有關如何使用上傳金鑰簽署應用程式的章節。如果只想產生金鑰和 KeyStore,請按一下「Cancel」

使用金鑰簽署應用程式

如果您已擁有上傳金鑰,請使用該金鑰簽署應用程式。如果應用程式已使用現有的應用程式簽署金鑰完成簽署並發布至 Google 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. 按一下「Next」

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

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

  8. 按一下「Create」

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

Android Studio 完成建構已簽署的應用程式後,您可以在彈出式通知中按一下適當選項,以找出分析應用程式,如圖 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 the same key as another app in this account」、選取一個應用程式,接著點選「Continue」
    • 如要提供自己的簽署金鑰讓 Google 簽署應用程式,請依序選取「變更應用程式簽署金鑰」和其中一個「匯出並上傳」選項,以安全的方式上傳私密金鑰及其公開憑證。

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

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

將現有應用程式加入計畫

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

  1. 登入 Play 管理中心,然後前往您的應用程式。
  2. 在左選單中依序點選「版本」>「設定」>「應用程式簽署」
  3. 如果適用,請詳閱《服務條款》,並選取「接受」
  4. 根據您要上傳到 Google Play 的簽署金鑰,選擇最符合的選項,然後按照畫面顯示的指示操作。舉例來說,如果您將 Java KeyStore 用於簽署金鑰,請選取「上傳來自 Java KeyStore 的新應用程式簽署金鑰」,然後按照操作說明下載及執行 PEPK 工具,並使用加密金鑰上傳產生的檔案。
  5. 按一下「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 時,您可以透過 Play 管理中心為已發布的應用程式升級簽署金鑰。新的金鑰會在 Android 13 以上版本中用於簽署安裝項目和應用程式更新,舊的應用程式簽署金鑰則會在舊版 Android 中用於為使用者簽署更新。

詳情請參閱升級應用程式簽署金鑰

重設遺失或遭駭的私密上傳金鑰

如果私密上傳金鑰遺失或遭駭,您可以建立新的金鑰並前往 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. 按一下要設定的變種版本,然後從「Signing Config」下拉式選單中選取適當的簽署設定。

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

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

  8. 按一下「OK」

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

執行簽署報告

如要取得各個應用程式變化版本的簽署資訊,請在 Android Studio 中執行 Gradle signingReport 工作:

  1. 依序點選「View」>「Tool Windows」>「Gradle」,開啟 Gradle 工具視窗
  2. 依序選取「YourApp」>「Tasks」>「android」>「signingReport」以執行報告

管理您的簽署金鑰

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

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

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

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

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