Android:Keystore 建立與管理

Published on:

撰文時使用 MAC + Android Studio 2.2RC

不管是使用 Google Map Android API(好吧,所有 Goolge APIs 其實都要) 還是要發布 App 到 Google Play,你都會需要一組屬於你自己或公司/組織專用的 Keystore 作為身份識別。

什麼?你說你不上架也不用 Google Services,就是很想要、非常想要一組 Keystore 可不可以?當然可以啊。

本文將會簡述如何使用 Android StudioCLI 介面產生 KeyStore,以及如何將它與專案分開存放與管理。

如何產生 Keystore

Keystore 是由 Java keytool 工具所產生的一種憑證,詳情可以看看維基百科的介紹。它作為開發者身份的驗證機制,被 Goolge 普遍用在其提供的 API 服務中,也包含在發布製作好的 App 到 Play 市集的過程中。

另外其實不只發布 App 時會用到,在開發過程中其實也會用到 debug 專用的 Keystore 來簽署 *.apk,可以參考這則 StackOverflow 的問答:Android Studio - debug keystore

* 注意!

要是成功上架/發布某個 App 之後,卻不小心忘了你用上架/發布 Keystore 的密碼、或是搞丟了,那你就再也不能更新已經上架的那隻 App 了。所有累積的下載量/曝光率等等的都會隨著打不開。所以請慎選密碼/存放位置,尊重生命,不要隨便搞自己。

* 使用 Android Studio 產生 Keystore

還在使用 Eclipse 或其他 IDE 的同學請直接跳下個章節,以 CLI 產生 Keystore。

Android Studio 作為 Android 生態圈代表性的 IDE,到目前為止已經整合了不少功能,無腦產生 Keystore 就是其中之一。請按照以下步驟執行,即可獲得龍珠 ... Keystore 一組:

1 . 點選 Build -> Generae Signed APK

2 . 在接下來跳出的視窗中選取 Create new...

3 . 輸入每個欄位所需的資料。

簡介一下每個欄位:

  • path - 你心心念念的 Keystore 要存在哪裡?
  • Password - 你的 Keystore 的主要加密密碼。
  • Key
    • Alias - 填個你覺得爽的名字吧!
    • Password - 這裡的密碼可以跟上面的 Password 一樣;但無論是否相同,請妥善保存密碼,尊重生命。
    • Validity - 有人說這邊可以越大越好,例如 10000。不過基本上指的就是這組憑證哪時候到期,如果沒有特殊需求保留預設值奇可。
    • Certificate
      • 以下欄位作為識別資料之用,選填。

4 . 接下來選擇下一步即可

到這邊你的 Keystore 就完成了。

* 使用 CLI 產生 Keystore

複製貼上即可,同時在互動式提示下完成資料輸入。

請分別注意 ${path}/${my_key_name}/${alias_name} 等參數。

$ keytool -genkey -v -keystore ${path}/${my_key_name}.keystore -alias ${alias_name} -keyalg RSA -keysize 2048 -validity 10000

完成後即可在路徑 ${path} 裡找到叫做 ${my_key_name}.keystore 的 Keystore 檔案。

設定 Gradle 將 Keystore 獨立出專案之外

本步驟可以省掉兩個問題:

  • 簽章時手動指定 Keystore
  • 多人或 git 版控時可以避免誤傳 Keystore

* 建立 keystore.properties

本步驟需要在專案根目錄下建立一個 .properties 檔案,同時將此檔案加入 .gitignore 中

檔名其實可以隨意,但為求統一,請命名為 keystore.properties。內容如下,請注意相關變數:

KEYSTORE_FILE=${path}/${my_key_name}
KEYSTORE_PASSWORD=${KEYSTORE_PASSWORD}
KEYSTORE_ALIAS=${ALIAS_NAME}
KEYSTORE_ALIAS_PASSWORD=${ALIAS_PASSWORD}

* 修改 build.gradle

本步驟需要修改專案下的 build.gradle 檔案,通常是路徑會是 ${PROJECT_NAME}/app/build.gradle。在最底下加入以下程式碼:

//rootProject.file(): 取得根目錄中的檔案
def ksFile = rootProject.file('keystore.properties')
def props = new Properties();
if (ksFile.canRead()) {
  props.load(new FileInputStream(ksFile))

  if (props != null) {
    android.signingConfigs.sign.storeFile file(props['KEYSTORE_FILE'])
    android.signingConfigs.sign.storePassword props['KEYSTORE_PASSWORD']
    android.signingConfigs.sign.keyAlias props['KEYSTORE_ALIAS']
    android.signingConfigs.sign.keyPassword props['KEYSTORE_ALIAS_PASSWORD']
  } else {
    println 'some entries in \'keystore.properties\' not found!'
  }
} else {
  println '\'keystore.properties\' not found!'
}

以上程式碼會在 android.signingConfigs 節點下新增一組存有 Keystore 所在位置、密碼等資訊並叫做 sign 的節點。

所以,要在針對 build.gradle 簽章的部分做相應修改,如下:

signingConfigs {
    sign // 清空只留下 `sign`
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.sign // 指定signingConfig
    }
}

由此可見這裡只針對 release 做設定而已,如果 debug 也有需要請比照辦理即可。

完整範例可以參考 Mosil 的 repo

Refs

Comments

comments powered by Disqus