Android 在不公开密钥库密码的情况下签署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文件都从版本控制中排除

需要注意的几件事:

  • 文件中storeFile指定的路径keystore.properties应相对于您应用的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中的壳。
在Linux中,可以通过编辑Android Studio的Desktop Entry

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

您可以在本主题中找到更多详细信息。