天天看點

Android簽名打包、密鑰庫、密鑰全面解析

前言

Android要求所有的應用必須進行數字簽名才可以釋出,也就是我們平時所說的使用證書打包然後上傳市場。這個簽署的過程又包括建立和存儲證書,使用不同證書簽署不同的建構配置,及自動簽署過程。

重要的角色:證書和密鑰庫

公鑰證書又稱為數字證書和身份證書包含公鑰/私鑰對的公鑰,以及可以辨別密鑰所有者的一些其他元素,例如名稱和位置,證書持有者持有對應的私鑰

在簽署工具簽署我們的APP時,會自動将我們的公鑰證書附加到APK中,并且關聯到該證書的持有者及持有者擁有的對應私鑰,這樣就保證了應用的每次更新都來自原創者。

用于創建立此公鑰證書的密鑰稱為應用簽名密鑰,也就是我們所說的密鑰。

簽署調試建構(即我們平時所說的Debug)

從IDE中運作或調試我們的項目時,Android Studio将自動使用通過Android SDK工具生成的調試證書簽署我們的APK,當我們在 Android Studio 中首次運作或調試項目時,IDE 将自動在 $HOME/.android/debug.keystore(~/.android/(OS X 和 Linux)

C:\Documents and Settings\.android\(Windows XP)

C:\Users\.android\ (Windows Vista,Windows 7、8 和 10)) 中建立調試密鑰庫和證書,并設定密鑰庫和密鑰密碼。

Android Studio會自動将我們的調試簽署資訊存儲到簽署配置中,是以我們不必每次調試時都輸入相關資訊。簽署配置是一種包含簽署APK所需全部必要資訊的對象,這些資訊包括密鑰庫位置、密鑰庫密碼、密鑰名稱和密鑰密碼

運作手後生成的APK目錄:項目位置-app-build-outputs-apk下

調試證書的有效期

Google将調試簽署 APK 的自簽署證書的有效期設定為365天,從建構該yingyong之日起,一旦到期,将會收到一個建構錯誤,要想修複次問題,必須删除上面所說的第一次建構時産生的debug.keystore檔案,當您下次建構和運作調試建構類型時,這些建構工具将重新生成新的密鑰庫和調試密鑰。請注意,您必須運作應用,單純的建構不會重新生成密鑰庫和調試密鑰。

建立密鑰和密鑰庫

Android Studio 生成應用簽名或上傳密鑰,步驟如下:

  • 1.在菜單欄中 點選Build->Generate Signed APK
  • 2.點選create new建立一個新的密鑰和密鑰庫
  • 3.在new key store視窗上,為密鑰和密鑰庫配置以下資訊
    Android簽名打包、密鑰庫、密鑰全面解析
  • Key store path:建立密鑰庫的位置
  • Password:為密鑰庫建立一個安全的密碼
  • 密鑰: Alias:為密鑰輸入一個辨別名
  • Password:為密鑰建立一個并确認安全的密碼(此密碼應當與密鑰庫的密碼不同)
  • Validity (years):以年為機關設定密鑰的有效時長。密鑰的有效期應至少為 25

    年,以便您可以在應用的整個生命期内使用相同的密鑰簽署應用更新。

  • Certificate:為證書輸入一些關于您自己的資訊。此資訊不會顯示在應用中,但會作為 APK 的一部分包含在您的證書中

    然後點選OK,這樣我們的密鑰庫和密鑰就生成了,然後就可以用來簽署我們的APK了

簽署APK

使用Android Studio可以一次簽署單個或多個APK,當然我們也可以将Gradle建構設定配置為在建構流程期間自動處理簽署。

  • 1.點選 Build > Generate Signed APK 以打開 Generate Signed APK 視窗。(如果您剛剛按上述說明生成了一個密鑰和密鑰庫,則此視窗已處于打開狀态。)
  • 2.在 Generate Signed APK Wizard 視窗上,選擇一個密鑰庫和一個私鑰,并為它們輸入密碼。(如果您剛剛在上一部分中建立密鑰庫,這些字段将自動填充。)然後,點選 Next
  • 3.在下一個視窗上,為簽署的 APK 選擇一個目的地、選擇建構類型、選擇産品風味(如果适用,即我們平時所說的釋出平台),然後點選 Finish 注:Android Studio 将為選擇的每個産品風味生成單獨的 APK。
  • Android簽名打包、密鑰庫、密鑰全面解析
    Android簽名打包、密鑰庫、密鑰全面解析

配置建構流程自動簽署APK

在Android Studio中我們可以建立一個簽署配置并配置設定至釋出建構類型,這樣就可以将我們的項目配置為在建構流程中自動簽署并釋出APK。一個簽署配置包括一個密鑰庫(jks檔案)的位置,密鑰庫的密碼(Key Store password),密鑰别名(Key alias),密鑰密碼(key password),要使用Android Studio建立一個簽署配置并配置設定至釋出建構類型,須按以下步驟:

  • 1.在 Project 視窗中,右鍵點選您的應用并點選 Open Module Settings。
  • 2.在 Project Structure 視窗左面闆中的 Modules 下,點選您想要簽署的子產品。
  • 3.點選 Signing 标簽,然後點選 Add。
  • 4.選擇您的密鑰庫檔案,為此簽署配置輸入一個名稱(因為您可能建立多個配置),然後輸入所需的資訊。
  • 5.點選 Build Types 标簽。
  • 6.點選 release 建構。
  • 7.在 Signing Config 下,選擇您剛建立的簽署配置
    Android簽名打包、密鑰庫、密鑰全面解析
    在您建立簽署配置時,您的簽署資訊将以純文字形式包含到 Gradle 建構檔案中。如果您是團隊協作開發或者公開分享自己的代碼,那麼您應當從建構檔案中移除簽署資訊并将其單獨存儲,進而確定此資訊的安全。

簽署不同市場

如果我們的應用在釋出在不同的市場并且以各自的方式簽署釋出,那我們可以建立更多的簽署配置并配置設定給對應的市場:

在 Project 視窗中,右鍵點選您的應用并點選 Open Module Settings。

  • 1.在 Project Structure 視窗左面闆中的 Modules 下,點選您想要簽署的子產品。
  • 2.點選 Signing 标簽,然後點選 Add
  • 3.選擇您的密鑰庫檔案,為此簽署配置輸入一個名稱(因為您可能建立多個配置),然後輸入所需的資訊。
  • 4.選擇您的密鑰庫檔案,為此簽署配置輸入一個名稱(因為您可能建立多個配置),然後輸入所需的資訊。
  • 5.如果需要,請重複第 3 步和第 4 步,直到您完成所有簽署配置的建立。
  • 6.點選 Flavors 标簽。
  • 7.點選您想要配置的風味,然後從 Signing Config 下拉菜單中選擇合适的簽署配置。

    比如:我們使用之前配置的config簽署小米市場

    Android簽名打包、密鑰庫、密鑰全面解析

簽署注意事項

為什麼在軟體的生命周期内要使用相同的證書簽署應用呢?原因如下:

  • 應用更新:當系統安裝應用的更新時,它會比較新版本和現有版本中的證書。如果證書比對,則系統允許更新。如果您使用不同的證書簽署新版本,則必須為應用配置設定另一個軟體包名稱 在此情況下,使用者将新版本作為全新應用安裝。
  • 應用子產品化:Android 允許通過相同證書簽署的多個 APK

    在同一個程序中運作(如果應用請求這樣),以便系統将它們視為單個應用。通過此方式,您可以在子產品中部署您的應用,且使用者可以獨立更新每個子產品。

  • 通過權限共享代碼/資料:Android

    提供基于簽名的權限執行,以便應用可以将功能展示給使用指定證書簽署的另一應用。通過使用同一個證書簽署多個 APK

    并使用基于簽名的權限檢查功能,您的應用可采用安全的方式共享代碼和資料。

從配置檔案中移除簽署資訊

在我們建立簽署資訊時,Android Studio會以純文字的形式将簽署資訊添加到子產品的build.gradle檔案中,如果您是團隊協作開發或者将您的代碼開源,那麼您應當将此敏感資訊從建構檔案中移出,以免被其他人輕易擷取。為此,您應建立一個單獨的屬性檔案來存儲安全資訊并按以下步驟操作,在您的建構檔案中引用該檔案:

  • 1.建立一個簽署配置,并将其配置設定至一個或多個建構類型。這些說明假設您已經按照上面配置建構流程以自動簽署您的 APK 部分所述,為釋出建構類型配置了一個簽署配置。
  • 2.在項目的根目錄下建立一個名為 keystore.properties 的檔案。此檔案應當包含您的簽署資訊,如下所示:
storePassword=myStorePassword
keyPassword=mykeyPassword
keyAlias=myKeyAlias
storeFile=myStoreFileLocation
           
Android簽名打包、密鑰庫、密鑰全面解析
Android簽名打包、密鑰庫、密鑰全面解析

- 3.在子產品的 build.gradle 檔案中,于 android {} 塊的前面添加用于加載 keystore.properties 檔案的代碼

// 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 {
    ...
}
           
Android簽名打包、密鑰庫、密鑰全面解析

- 4.我們也可以使用文法 keystoreProperties[‘propertyName’] 引用存儲在 keystoreProperties 中的屬性。修改子產品 build.gradle 檔案的 signingConfigs

塊,以便使用此文法引用存儲在 keystoreProperties 中的簽署資訊

android {
    signingConfigs {
        config {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }
    ...
  }
           
  • 5.打開 Build Variants 工具視窗并確定已選擇釋出建構類型。
  • 6.點選 Build > Build APK 以建構您的釋出建構,并确認 Android Studio 已在子產品的 build/outputs/apk/ 目錄中建立一個簽署的 APK。

    由于您的建構檔案不再包含敏感資訊,您現在可以将其包含在源控制中或者上傳到共享的代碼庫。務必保證 keystore.properties

    檔案的安全。您可能需要将其從您的源控制系統中移除。

以上就是小白對簽署應用做的一些總結,希望對大家有所幫助!後面小白會介紹如何從指令行簽署一個應用!

繼續閱讀