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