签署 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"
你可以在此主题中找到更多详细信息。