android studio 簽名配置
Android要求所有APK在安裝之前都必須使用證書進行數字簽名。本文件介紹如何使用Android Studio簽名APK,包括建立和儲存證書,使用不同證書籤署不同的構建配置,以及配置構建過程以自動簽名APK。
證書和金鑰庫
公開金鑰證書(也稱為數字證書或身份證書)包含公共/私人金鑰對的公共金鑰以及標識金鑰所有者的一些其他元資料(例如名稱和位置)。證書的所有者儲存相應的私鑰。
當您簽署APK時,簽名工具將公鑰證書附加到APK。公鑰證書作為“APK”,將APK與您和您對應的私鑰唯一相關聯。這有助於Android確保您的APK的任何未來更新都是真實的,並且來自原作者。用於建立此證書的金鑰稱為應用程式簽名金鑰
金鑰庫是包含一個或多個私鑰的二進位制檔案。
每個應用程式必須在整個使用壽命期間使用相同的證書,以便使用者能夠將新版本作為應用程式的更新安裝。有關在整個使用壽命期間為所有應用程式使用相同證書的更多資訊,請參閱 下面的簽名注意事項。
簽署您的除錯版本
當您從IDE中執行或除錯專案時,Android Studio會使用Android SDK工具生成的除錯證書自動簽名您的APK。首次在Android Studio中執行或除錯專案時,IDE會自動建立除錯金鑰庫和證書$HOME/.android/debug.keystore
,並設定金鑰庫和金鑰密碼。
由於除錯證書是由構建工具建立的,並且設計不安全,所以大多數應用商店(包括Google Play商店)都不會接受使用除錯證書籤發的APK進行釋出。
Android Studio會自動將您的除錯簽名信息儲存在簽名配置中,因此您每次除錯時都不必輸入。簽名配置是一個物件,包括簽名APK的所有必要資訊,包括金鑰庫位置,金鑰庫密碼,金鑰名稱和金鑰密碼。您無法直接編輯除錯簽名配置,但您可以配置如何簽名釋出版本。
有關如何構建和執行應用程式進行除錯的更多資訊,請參閱 構建和執行應用程式。
除錯證書到期
用於簽署APK進行除錯的自簽名證書的建立日期為365天。當證書過期時,您將收到一個構建錯誤。
要解決這個問題,只需刪除該debug.keystore
檔案。該檔案儲存在以下位置:
~/.android/
在OS X和Linux上C:\Documents and Settings\<user>\.android\
C:\Users\<user>\.android\
在Windows Vista和Windows 7,8和10上
下次構建和執行除錯構建型別時,構建工具將重新生成新的金鑰庫和除錯金鑰。請注意,您必須執行您的應用程式,單獨構建不會重新生成金鑰庫和除錯金鑰。
管理你的鑰匙
因為您的應用簽名金鑰用於驗證您的開發人員的身份,並確保為使用者提供無縫和安全的更新,管理金鑰並保持安全,這對您和您的使用者都非常重要。您可以選擇使用Google Play應用程式簽名,使用Google的基礎架構安全地管理和儲存應用簽名金鑰,也可以管理和保護您自己的金鑰庫和應用簽名金鑰。
使用Google Play應用程式簽名
使用Google Play應用簽名時,您將使用兩個鍵:應用簽名金鑰和上傳金鑰。Google管理並保護您的應用簽名金鑰,並保留上傳金鑰,並使用它來簽署您的應用以上傳到Google Play商店。
當您選擇使用Google Play應用簽名功能時,您可以使用Google Play提供的Play Encrypt Private Key工具匯出並加密您的應用簽名金鑰,然後將其上傳到Google的基礎設施。然後,您建立一個單獨的上傳金鑰並將其註冊到Google。準備釋出時,您可以使用上傳鍵簽署您的應用,並將其上傳到Google Play。Google然後使用上傳證書驗證您的身份,並使用您的應用程式簽名金鑰重新簽名APK,如圖1所示。(如果您還沒有應用簽名金鑰,則可以在簽名過程中生成一個密碼,程序)
當您使用Google Play應用程式簽名時,如果您丟失上傳金鑰,或者如果它被盜用,您可以聯絡Google撤銷舊的上傳金鑰並生成一個新的金鑰。由於您的應用簽名金鑰由Google保護,您可以繼續將新版本的應用程式上傳到原始應用的更新,即使您更改了上傳金鑰。
有關如何選擇使用Google Play應用簽名的詳細資訊,請參閱 管理應用簽名金鑰。
管理您自己的金鑰和金鑰庫
您可以選擇管理自己的應用簽名金鑰和金鑰庫,而不是使用Google Play應用簽名。如果您選擇管理自己的應用程式簽名金鑰和金鑰庫,則負責保護金鑰和金鑰庫。您應該為金鑰庫選擇一個強密碼,併為儲存在金鑰庫中的每個私鑰分別輸入一個強密碼。您必須將金鑰庫儲存在安全可靠的位置。如果您無法訪問您的應用簽名金鑰或金鑰遭到入侵,Google無法為您檢索應用簽名金鑰,您將無法將新版本的應用釋出給使用者,因為原始應用的更新。有關詳細資訊,請參閱下面的保護您的金鑰。
如果您管理自己的應用程式簽名金鑰和金鑰庫,當您簽署APK時,您將使用您的應用簽名密碼在本地簽名,並將簽名的APK直接上傳到Google Play商店進行分發,如圖2所示。
籤一個APK
無論您如何選擇管理金鑰和金鑰庫,您都可以使用Android Studio手動簽名您的APK(使用上傳金鑰或應用簽名金鑰),或者通過配置自己的構建過程來自動簽名APK。
如果您選擇管理和保護自己的應用程式簽名金鑰和金鑰庫,您將使用應用程式簽名金鑰對您的APK進行簽名。如果您選擇使用Google Play應用簽名來管理和保護您的應用簽名金鑰和金鑰庫,您將使用上傳金鑰來簽名您的APK。
生成金鑰和金鑰庫
您可以使用Android Studio生成應用程式簽名或上傳金鑰,使用以下步驟:
- 在選單欄中,單擊構建 > 生成簽名的APK。
- 從下拉列表中選擇一個模組,然後單擊 下一步。
-
單擊建立新建以建立新金鑰和金鑰庫。
-
在“ 新建金鑰儲存”視窗中,為金鑰庫和金鑰提供以下資訊,如圖3所示。
金鑰庫
- 金鑰儲存路徑:選擇應建立金鑰庫的位置。
- 密碼:為金鑰庫建立並確認安全密碼。
鍵
- 別名:輸入金鑰的識別名稱。
- 密碼:建立並確認金鑰的安全密碼。這與您為金鑰庫選擇的密碼不同
- 有效期(年):設定您的金鑰有效期的時間長度。您的金鑰應至少有效期至少25年,因此您可以在應用程式的使用期限內使用相同的金鑰簽署應用更新。
- 證書:輸入有關您自己的證書資訊。此資訊不會顯示在您的應用中,但作為APK的一部分包含在您的證書中。
完成表單後,單擊確定。
- 繼續手動登入APK,如果您想生成使用新金鑰簽名的APK,或者如果您只想生成金鑰和金鑰庫,而不是簽署APK ,請單擊 取消。
- 如果您想選擇使用Google Play應用簽名,請繼續 管理您的應用簽名金鑰,並按照說明設定Google Play應用簽名。
手動簽名APK
您可以使用Android Studio手動生成簽名的APK,一次一個,或一次建立多個構建變體。而不是手動簽名APK,您也可以配置您的Gradle構建設定,以便在構建過程中自動處理簽名。本節介紹手動簽名過程。有關在構建過程中籤名應用程式的更多資訊,請參閱配置構建過程以自動簽名您的APK。
要在Android Studio中手動簽名釋出APK,請按照下列步驟操作:
- 單擊構建>生成簽名的APK以開啟生成簽名的APK視窗。(如果您剛才生成的金鑰和金鑰庫如上所述,此視窗將已經開啟。)
-
在“ 生成簽名的APK嚮導”視窗中,選擇金鑰庫,私鑰,然後輸入兩者的密碼。(如果您剛剛在上一節中建立了金鑰庫,那麼這些欄位已經為您填充了。)然後單擊下一步。
注意:如果您使用Google Play應用程式簽名,則應在此處指定上傳金鑰。如果您正在管理自己的應用程式簽名金鑰和金鑰庫,則應指定應用程式簽名金鑰。有關詳細資訊,請參閱上述管理您的金鑰。
-
在下一個視窗中,選擇已簽名的APK的目的地,選擇構建型別(如果適用)選擇產品風味,然後單擊 完成。
注意:如果您的專案使用產品風味,您可以在Windows / Linux上按住Control鍵或Mac OSX上的 Command鍵時選擇多種產品風味 。Android Studio將為每個選定的產品風格生成一個單獨的APK。
程序完成後,您將在您上面選擇的目標資料夾中找到已簽名的APK。您現在可以通過Google Play商店等應用程式市場或使用您選擇的機制釋出已簽名的APK。有關如何將已簽名的APK釋出到Google Play商店的詳情,請參閱“開始使用釋出”。要了解更多關於其他分發選項,閱讀 另類的分佈選項。
為了讓使用者成功安裝應用程式的更新,您需要在整個應用程式的使用期限內使用相同的證書籤署APK。有關使用相同金鑰簽名所有應用的其他好處,請參閱下面的簽名注意事項。有關保護您的私鑰和金鑰庫的更多資訊,請參閱下面的保護金鑰。
配置構建過程以自動簽名您的APK
在Android Studio中,您可以通過建立簽名配置並將其分配給發行版構建型別,在構建過程中自動配置您的專案以自動簽名發行版APK。簽名配置由金鑰庫位置,金鑰庫密碼,金鑰別名和金鑰密碼組成。要建立一個簽名配置並使用Android Studio將其分配給您的發行版構建型別,請使用以下步驟:
- 在“ 專案”視窗中,右鍵單擊應用程式,然後單擊“ 開啟模組設定”。
- 在“ 專案結構”視窗 的“左側面板模組 ”下,單擊要簽名的模組。
- 單擊簽名選項卡,然後單擊新增 。
-
選擇您的金鑰庫檔案,輸入此簽名配置的名稱(您可能建立多個),然後輸入所需的資訊。
- 單擊構建型別選項卡。
- 點選釋出版本。
-
在簽名配置下,選擇剛剛建立的簽名配置。
- 單擊確定。
現在,每次使用Android Studio構建版本構建型別時,IDE將使用您指定的簽名配置自動簽名APK。您可以在build/outputs/apk/
您正在構建的模組的專案目錄下的資料夾中找到您簽名的APK 。
建立簽名配置時,您的簽名信息將以Gradle構建檔案中的純文字格式包含。如果您正在一個團隊工作或公開分享您的程式碼,那麼您應該通過將其從構建檔案中刪除並分開儲存來保持您的簽名信息的安全。您可以從構建檔案中刪除簽名信息,瞭解如何從構建檔案中 刪除簽名信息。有關保持簽名信息安全的更多資訊,請閱讀 安全金鑰。
以不同的方式標示每種產品的味
如果您的應用程式使用產品風格,並且您希望以不同的方式簽署每種風格,則可以建立其他簽名配置,並通過口味進行分配:
- 在“ 專案”視窗中,右鍵單擊應用程式,然後單擊“ 開啟模組設定”。
- 在“ 專案結構”視窗 的“左側面板模組 ”下,單擊要簽名的模組。
- 單擊簽名選項卡,然後單擊新增 。
-
選擇您的金鑰庫檔案,輸入此簽名配置的名稱(您可能建立多個),然後輸入所需的資訊。
- 根據需要重複步驟3和4,直到您建立了所有的簽名配置。
- 單擊Flavors選項卡。
- 單擊要配置的風格,然後從“ 簽名配置”下拉選單中選擇適當的簽名配置。
重複以配置任何其他產品風味。
- 單擊確定。
您還可以在Gradle配置檔案中指定您的簽名設定。有關詳細資訊,請參閱配置簽名設定。
簽署Android Wear應用程式
如果您正在構建Android Wear應用,則該應用的簽名過程可能與此頁面上描述的過程不同。請參閱有關 打包和釋出Android Wear應用程式的資訊。
簽署注意事項
您應該在所有應用程式的預期使用壽命期內使用相同的證書籤名所有的APK。有幾個原因你應該這樣做:
- 應用程序升級:當系統正在安裝對應用程式的更新時,它會將新版本的證書與現有版本中的證書進行比較。如果證書匹配,系統允許更新。如果您使用不同的證書籤署新版本,則必須為應用程式分配不同的軟體包名稱 - 在這種情況下,使用者將新版本作為全新應用程式安裝。
- 應用程式模組化:Android允許由相同證書籤名的APK在相同的過程中執行,如果應用程式請求,則系統將其視為單個應用程式。以這種方式,您可以在模組中部署應用程式,使用者可以獨立更新每個模組。
- 通過許可權進行程式碼/資料共享:Android提供基於簽名的許可權強制,以便應用程式可以將功能公開到使用指定證書籤名的另一個應用程式。通過簽署具有相同證書的多個APK並使用基於簽名的許可權檢查,您的應用程式可以以安全的方式共享程式碼和資料。
如果您計劃支援應用程式的升級,請確保您的應用程式簽名金鑰的有效期超過了該應用的預期使用壽命。推薦25年以上的有效期。當您的金鑰的有效期到期時,使用者將無法再無縫地升級到新版本的應用。
如果您打算在Google Play上釋出應用程式,則用於簽署這些APK的金鑰必須在2033年10月22日以後結束。Google Play強制執行此要求,以確保使用者可以在新版本可用時無縫升級應用。如果您使用 Google Play應用程式簽名,Google可確保您的應用程式已正確登入,並能在整個使用壽命期內接收更新。
確保你的鑰匙
如果您選擇管理和保護您的應用簽名金鑰,並自行密碼(而不是選擇使用Google Play應用簽名),則保護您的應用簽名金鑰對您和使用者至關重要。如果您允許某人使用您的金鑰,或者如果您將金鑰庫和密碼留在不安全的位置,以便第三方可以找到並使用它們,則您的創作身份和使用者的信任將受到損害。
注意:如果您使用Google Play應用簽名,您的應用簽名金鑰將使用Google的基礎架構保持安全。您仍然應如下所述保持您的上傳金鑰安全。如果您的上傳金鑰遭到入侵,您可以聯絡Google撤銷並接收新的上傳金鑰。
如果第三方在未經您的認可或許可的情況下設法取代您的金鑰,那麼該使用者可以簽署並分發惡意替換您的正版應用程式或將其破壞的應用程式。這樣的人也可以根據您的身份簽署和分發攻擊其他應用或系統本身的應用,或損壞或竊取使用者資料。
您的私人金鑰是簽名所有未來版本的應用程式所必需的。如果丟失或錯位您的金鑰,您將無法釋出現有應用的更新。您無法重新生成以前生成的金鑰。
您作為開發人員實體的聲譽取決於您在任何時候正確保護您的應用簽名金鑰,直到金鑰過期。這裡有一些提示,以保護您的鑰匙安全:
- 為金鑰庫和金鑰選擇強密碼。
- 不要給任何人或任何你的私鑰,不要讓未經授權的人知道你的金鑰庫和金鑰密碼。
- 將包含您的私鑰的金鑰庫檔案儲存在一個安全,安全的地方。
一般來說,如果您在生成,使用和儲存金鑰時遵循常識性注意事項,則它將保持安全。
從構建檔案中刪除簽名信息
建立簽名配置時,Android Studio會將您的簽名信息以純文字形式新增到模組的build.gradle
檔案中。如果您正在與團隊合作或開原始碼,您應該將這些敏感資訊從構建檔案中移出,以便其他人不容易訪問。為此,您應該建立一個單獨的屬性檔案來儲存安全資訊,並在構建檔案中引用該檔案,如下所示:
- 建立簽名配置,並將其分配給一個或多個構建型別。這些說明假設您已為您的發行版構建型別配置了單個簽名配置,如上所述配置構建過程以自動簽名您的APK所述。
- 建立一個
keystore.properties
在專案的根目錄中命名的檔案。此檔案應包含您的簽名信息,如下所示:storePassword = myStorePassword keyPassword = mykeyPassword keyAlias = myKeyAlias storeFile = myStoreFileLocation
- 在您的模組
build.gradle
檔案中,新增程式碼以keystore.properties
在android {}
塊之前載入 檔案。... //建立一個名為keystorePropertiesFile的變數,並在rootProject資料夾中將其初始化為// keystore.properties檔案。def keystorePropertiesFile = rootProject 。file (“keystore.properties” )//初始化一個名為keystoreProperties的新的Properties()物件。def keystoreProperties = new Properties ()//將您的keystore.properties檔案載入到keystoreProperties物件中。金鑰庫屬性。load (new FileInputStream (keystorePropertiesFile ))android { ... }
注意:您可以選擇將
keystore.properties
檔案儲存 在另一個位置(例如,在模組資料夾中,而不是專案的根資料夾,或者在使用連續整合工具的情況下,在構建伺服器上)。在這種情況下,您應該keystorePropertiesFile
使用實際keystore.properties
檔案的位置來修改上述程式碼以正確初始化 。 - 您可以參考
keystoreProperties
使用語法儲存的屬性。修改模組的檔案塊, 以引用使用此語法儲存的簽名信息 。keystoreProperties['propertyName']
signingConfigs
build.gradle
keystoreProperties
android { signatureConfigs { config { keyAlias keystoreProperties [ 'keyAlias' ] keyPassword keystoreProperties [ 'keyPassword' ] storeFile檔案(keystoreProperties [ 'storeFile' ]) storePassword keystoreProperties [ 'storePassword' ] } } ... }
- 開啟構建變數工具視窗,並確保選擇版本構建型別。
- 單擊構建>構建APK以構建您的釋出版本,並確認Android Studio已在
build/outputs/apk/
您的模組目錄中建立了一個已簽名的APK 。
因為您的構建檔案不再包含敏感資訊,您現在可以將它們包含在原始碼控制中或將其上傳到共享程式碼庫。確保保持keystore.properties
檔案的安全。這可能包括從源控制系統中刪除它。
從命令列構建並簽署您的應用程式
您不需要Android Studio簽署您的應用程式。您可以使用該apksigner
工具從命令列簽名應用程式,也可以在構建過程中配置Gradle為您簽名。無論哪種方式,您都需要先使用私鑰生成。例如:
keytool -genkey -v -keystore my-release-key.jks -keyalg RSA-keysize 2048 -validity 10000 -alias我的別名
注意: keytool
位於bin/
JDK 中的目錄中。要從Android Studio找到您的JDK,請選擇檔案>專案結構,然後單擊SDK位置,您將看到JDK位置。
此示例提示您輸入金鑰庫和金鑰的密碼,並提供金鑰的可分辨名稱欄位。然後,它將生成金鑰庫作為一個檔案my-release-key.jks
,將其儲存在當前目錄中(您可以隨意移動它)。金鑰庫包含一個有效期為10,000天的單個金鑰。
構建一個未簽名的APK並手動簽名
- 開啟命令列並導航到專案目錄的根目錄 - 從Android Studio中選擇“ 檢視”>“工具視窗”>“終端”。然後呼叫
assembleRelease
任務:畢業組合
這將建立一個名為APK
module_name-unsigned.apk
在 。此時APK 無符號且未對齊,只有使用私鑰簽名才能安裝APK 。project_name/module_name/build/outputs/apk/
-
使用以下命令對齊未簽名的APK :
zipalign -v -p 4 my-app-unsigned.apk my-app-unsigned-aligned.apk
zipalign
確保所有未壓縮的資料以相對於檔案開頭的特定位元組對齊開始,這可能減少應用程式消耗的RAM量。 -
用您的私鑰使用
apksigner
以下方式簽名您的APK :apksigner sign --ks my-release-key.jks --out my-app-release.apk my-app-unsigned-aligned.apk
這個例子簽署的APK在輸出
my-app-release.apk
與被儲存在單個金鑰庫檔案的私鑰和證書籤名之後:my-release-key.jks
。該
apksigner
工具支援其他簽名選項,包括使用單獨的私鑰和證書檔案簽名APK檔案,並使用多個簽名者簽名APK。有關詳細資訊,請參閱apksigner
參考。注意:要使用該
apksigner
工具,必須安裝Android SDK Build Tools的版本為24.0.3或更高版本。您可以使用SDK Manager更新此軟體包。 -
驗證您的APK是否已簽名:
apksigner驗證我的app-release.apk
配置Gradle來簽署你的APK
- 開啟模組級的
build.gradle
檔案,並新增signingConfigs {}
與條目塊storeFile
,storePassword
,keyAlias
和keyPassword
,再傳遞物件到signingConfig
您的構建型別屬性。例如:android { ... defaultConfig { ... } signatureConfigs { release { storeFile file (“my-release-key.jks” ) storePassword “password” keyAlias “my-alias” keyPassword “password” } } buildTypes { release { signatureConfig signingConfigs 。釋出... } } }
因為Gradle讀取相對於該路徑的路徑
build.gradle
,所以上述示例僅my-release-key.jks
在與該build.gradle
檔案位於同一目錄中時才起作用。注意:在這種情況下,
build.gradle
檔案中可以直接看到金鑰庫和金鑰密碼。為了提高安全性,您應該從構建檔案中刪除簽名信息。 - 在專案根目錄中開啟一個命令列並呼叫該
assembleRelease
任務:畢業組合
這將建立一個名為APK module_name-release.apk
在 。該APK檔案使用您的檔案中指定的私鑰進行簽名, 並與之對齊。project_name/module_name/build/outputs/apk/
build.gradle
zipalign
現在,您已使用簽名金鑰配置釋出版本,“安裝”任務可用於該構建型別。因此,您可以在模擬器或裝置上構建,對齊,簽名和安裝版本APKinstallRelease
。