簽署 APK 而不暴露金鑰庫密碼

你可以使用以下屬性定義簽名配置以在 build.gradle 檔案中對 apk 進行簽名:

  • storeFile:金鑰庫檔案
  • storePassword:金鑰庫密碼
  • keyAlias:一個關鍵的別名
  • keyPassword:金鑰別名密碼

在許多情況下,你可能需要避免在 build.gradle 檔案中使用此類資訊。

方法 A:使用 keystore.properties 檔案配置釋出簽名

你可以配置應用程式的 build.gradle,以便從 keystore.properties 等屬性檔案中讀取簽名配置資訊。

像這樣設定簽名是有益的,因為:

  • 你的簽名配置資訊與你的 build.gradle 檔案是分開的
  • 你無需在簽名過程中進行干預,以便為金鑰庫檔案提供密碼
  • 你可以輕鬆地從版本控制中排除 keystore.properties 檔案

首先,在專案的根目錄中建立一個名為 keystore.properties 的檔案,其內容如下(用你自己的值替換值):

storeFile=keystore.jks
storePassword=storePassword
keyAlias=keyAlias
keyPassword=keyPassword

現在,在你的應用程式的 build.gradle 檔案中,設定 signingConfigs 塊,如下所示:

android {
...

    signingConfigs {
        release {
            def propsFile = rootProject.file('keystore.properties')
            if (propsFile.exists()) {
                def props = new Properties()
                props.load(new FileInputStream(propsFile))
                storeFile = file(props['storeFile'])
                storePassword = props['storePassword']
                keyAlias = props['keyAlias']
                keyPassword = props['keyPassword']
            }
        }
    }
}

這就是它的全部內容,但不要忘記從版本控制中排除金鑰庫檔案和 keystore.properties 檔案

有幾點需要注意:

  • keystore.properties 檔案中指定的 storeFile 路徑應該相對於應用的 build.gradle 檔案。此示例假定金鑰庫檔案與應用程式的 build.gradle 檔案位於同一目錄中。
  • 此示例在專案的根目錄中包含 keystore.properties 檔案。如果將其放在其他位置,請務必將 rootProject.file('keystore.properties') 中的值更改為相對於專案根目錄的屬性。

方法 B:使用環境變數

沒有屬性檔案也可以實現同樣的目的,使密碼更難找到:

android {

  signingConfigs {
    release {
        storeFile file('/your/keystore/location/key')
        keyAlias 'your_alias'
        String ps = System.getenv("ps")
        if (ps == null) {
             throw new GradleException('missing ps env variable')
        }
        keyPassword ps
        storePassword ps
    }
}

ps 環境變數可以是全域性的,但更安全的方法可以是將其新增到 Android Studio 的 shell 中。
在 linux 中,這可以通過編輯 Android Studio 的 Desktop Entry 來完成

Exec=sh -c "export ps=myPassword123 ; /path/to/studio.sh"

你可以在此主題中找到更多詳細資訊。