前言:如果想要在 Google Play 發布 APP ,需要有 jks 金鑰的 APK,那麼接下來我們將介紹如何生成具有 jks 金鑰的APK檔。

一、生成 jks 金鑰

1.點選 Android Studio 上方選單的 Build / Generate Signed APK 。

2.這邊可以依個人情況選擇,Android App Bundle是Android的新的官方發布格式,或者是單純在自己的裝置安裝 APK 所使用的格式。

3.生成 Key Store 檔案,因為是第一次生成,所以點「Create New…」,如果有生成過,之後會自動導入。

這裡要注意的地方是,之後都要用這次產生的 Key Store 才能更新 APP ,如果使用不同的 Key Store ,會被認定為不同的 APK 而無法更新。

4.輸入生成 Key Store 的需要的資料:

Key store path: 選擇要儲存的檔案位置,之後記得備份這個檔案
Password: Confirm: 設定存取這個檔案的密碼
Key Alias: 金鑰的別名,使用APP的名稱即可
Password: Confirm: 設定金鑰的密碼
Validity years: 有效期限,用預設的25年即可
Certificate: 証書的資料,只要設定 First and Last Name 即可,其他選填

5.生成完 Key Store 後,輸入剛才設定的 Key store password 跟 Key password 就可以按下 Next 開始下一步

6.Build Variants的 debug 是指測試用的簽名, release 則是以後要正式上線的簽名,這裡依個人情況選擇, Signature Versions 的 V1 與 V2 ,一定要勾選,否則安裝 apk 的時候,會出現未安裝應用程式的錯誤,勾選完後,點選 Finish ,就會生成 jks 檔。

雖然這時已經生成 jks 檔案了,但是還需要在 Android 專案裡導入 jks 金鑰才能讓 本地 APP 具有 jks 金鑰;需要在 Android 專案的 Gradle Scripts / build.gradle (Module:app) 裡設定。

在剛才設定的路徑下,將生成 jks 金鑰檔

二、導入 jks 金鑰

1.由於不能將 KeyStore 的密碼大剌剌的寫在 Gradle Script 裡頭,所以我們需要對這些資訊更加小心的處理才行,為了避免洩露敏感資訊,要在此 Android 專案的根目錄建立一個 keystore.properties 檔案。

2.在 keystore.properties 輸入第一部分第4點輸入的 KEYSTORE_PASSWORD 、 KEYSTORE_ALIAS、 KEYSTORE_ALIAS_PASSWORD

3.再來就可以到 Gradle Scripts / build.gradle (Module:app) 進行 jks 金鑰的設定了,首先,先修改一下版本編號 , 找到以下這兩行, versionCode 只能用整數,下次更新時再加1即可, versionName 是給使用者看的字串,可以用像是 1.0、1.1、2.3.4 這樣的版本號。

4.接下來在 Gradle Script 裡頭加入與 Signing 相關設定。好讓 Gradle 在 Build 時知道該填入什麼,該從哪處得到 key。

我們可以在 app module 裡頭為它的 Gradle Script 加入 Signing Configs 設定,這個設定要加在 android 這個 scope 裡, storeFile 表示讀檔,然後填下 KeyStore 的路徑。

再來就是 buildTypes 的設定,依據剛才第一部分第6點的選擇,填下 release 或是 debug 其一即可。

android {
    signingConfigs {
        sign {
            storeFile file("Your KeyStore Path")
            sign
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.sign
        }
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.sign
        }
    }

    //以下省略其他程式碼
    ...

}

5.接下來就要讓此專案取得 keystore.properties 裡頭的變數,一樣在 Gradle Scripts / build.gradle (Module:app) 裡進行設定。

//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.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!'
}

6.點選左下角的 build Variants ,依據剛才第二部分第4點的選擇,選擇要用 debug 或是 release 。

7.接下來點選 Gradle 後,再點選 signingReport ,如果下方的的訊息沒有顯示錯誤,以及有出現 key Store 的訊息,及代表有成功導入 jks 金鑰。

8.最後點選 Android Studio 上方選單的 Build/Build Bundle(s)/APK(s) 的 Build APK(s) ,開始打包 APK 。

9.打包完成後,點選 locate 即可開啟 APK 所在的資料夾。

參考資料:

https://www.itread01.com/p/1369640.html

https://disp.cc/b/11-98PR

https://dotblogs.com.tw/newmonkey48/2017/12/23/122425

https://medium.com/@louis383/%E5%9C%A8-build-apk-%E7%9C%81%E5%8E%BB%E7%B9%81%E6%96%87%E7%B8%9F%E7%AF%80-880020ae3074