Android Gradle - 从外部文件加载签名配置

18

在 Android 的 Gradle 中,似乎通行的做法是像这样定义您的签名配置以进行发布构建:

android {
    signingConfigs {
        debug {
            storeFile file("debug.keystore")
        }

        myConfig {
            storeFile file("other.keystore")
            storePassword "android"
            keyAlias "androiddebugkey"
            keyPassword "android"
        }
    }

    buildTypes {
        foo {
            debuggable true
            jniDebugBuild true
            signingConfig signingConfigs.myConfig
        }
    }
}

问题是,我希望将我的build.gradle文件保存在版本控制中,但不想在某个git服务器上存储我的keystore密码(这与我用于其他事情的密码相同,很蠢,我知道)。

是否有一种方法可以从硬盘上的外部文件加载签名配置?


这个回答解决了你的问题吗?在不将密钥库信息放入build.gradle文件的情况下签署APK - Mahozad
4个回答

34

我使用类似这样的东西。

在我的应用根目录中有一个signing.properties文件。

STORE_FILE=xxxx
STORE_PASSWORD=xxx
KEY_ALIAS=xxx
KEY_PASSWORD=xxx

这个文件没有被版本控制。 当然,你可以更换文件夹。

然后在你的 build.gradle 文件中可以使用类似以下代码:

 android {

        signingConfigs {
            release
        }

        buildTypes {
                release {
                    signingConfig signingConfigs.release
                }     
        }
    }

    def Properties props = new Properties()
    def propFile = file('../signing.properties')
    if (propFile.canRead()){
        props.load(new FileInputStream(propFile))

        if (props!=null && props.containsKey('STORE_FILE') && props.containsKey('STORE_PASSWORD') &&
                props.containsKey('KEY_ALIAS') && props.containsKey('KEY_PASSWORD')) {

            android.signingConfigs.release.storeFile = file(props['STORE_FILE'])
            android.signingConfigs.release.storePassword = props['STORE_PASSWORD']
            android.signingConfigs.release.keyAlias = props['KEY_ALIAS']
            android.signingConfigs.release.keyPassword = props['KEY_PASSWORD']
        } else {
            android.buildTypes.release.signingConfig = null
        }
    }else {
        android.buildTypes.release.signingConfig = null
    }
如果您更改了文件夹,您必须更改此行:
 def propFile = file('../signing.properties')

我正在尝试相同的操作,但是不是硬编码路径,而是从local.properties中获取路径。它可以读取文件,但在properties.load(new FileInputStream(propFile))这一行中显示Error:(33, 0) Malformed \uxxxx encoding. 我甚至已经硬编码了路径并尝试了一下,但没有用。有什么帮助吗? - Kavin Prabhu

3

针对Kotlin脚本 (build.gradle.kts)

将一个文件 signing.properties 放在与模块特定的 build.gradle.kts 文件相同的位置。不要忘记将它添加到你的 .gitignore 文件中!

signing.properties

storeFilePath=/home/willi/example.keystore
storePassword=secret
keyPassword=secret
keyAlias=myReleaseSigningKey

build.gradle.kts

android {
    // ...
    signingConfigs {
        create("release") {
            val properties = Properties().apply {
                load(File("signing.properties").reader())
            }
            storeFile = File(properties.getProperty("storeFilePath"))
            storePassword = properties.getProperty("storePassword")
            keyPassword = properties.getProperty("keyPassword")
            keyAlias = properties.getProperty("keyAlias")
        }
    }

    buildTypes {
        getByName("release") {
            signingConfig = signingConfigs.getByName("release")
            // ...
        }
    }
}

1
你正在使用硬编码的keyAlias,而不是属性文件中的那个。 - Jakoss
2
此示例需要 import java.util.Properties - Peter F

3

Groovy(build.gradle)

将文件signing.properties放在特定模块的build.gradle所在的位置。不要忘记将其添加到.gitignore文件中!

signing.properties

storeFilePath=/home/willi/example.keystore
storePassword=secret
keyPassword=secret
keyAlias=myReleaseSigningKey

build.gradle

android {
    // ...
    signingConfigs{
        release {
            def props = new Properties()

            def fileInputStream = new FileInputStream(file('../signing.properties'))
            props.load(fileInputStream)
            fileInputStream.close()

            storeFile = file(props['storeFilePath'])
            storePassword = props['storePassword']
            keyAlias = props['keyAlias']
            keyPassword = props['keyPassword']
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
            // ...
        }
    }
}

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接