签署 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"

你可以在此主题中找到更多详细信息。