gradle设置密钥库文件的绝对路径值

时间:2016-03-14 09:26:10

标签: android gradle groovy

我想将我的密钥库保存在项目目录之外。我不想在存储库中存储文件路径,因此我将值委托给~/.gradle/gradle.properties中的相应gradle变量 我无法接受以下绝对路径: /Users/username/.gradle/keystores/project/release.key 要么 ~/.gradle/keystores/project/release.key

我试过了: storeFile file(RELEASE_STORE_FILE)storeFile new File(RELEASE_STORE_FILE)

但是,它们似乎都没有用。

如何通过RELEASE_STORE_FILE变量将绝对路径值传递给密钥库文件?

android {
    signingConfigs {
        release {
            storeFile file(RELEASE_STORE_FILE)
            storePassword RELEASE_STORE_PASS
            keyAlias RELEASE_ALIAS
            keyPassword RELEASE_KEY_PASS
        }
    }
}

~/.gradle/gradle.properties文件:

RELEASE_STORE_FILE=/Users/username/.gradle/keystores/project/release.key
RELEASE_STORE_PASS=******
RELEASE_ALIAS=******
RELEASE_KEY_PASS=******

简而言之:我想将绝对路径值传递给gradle。

4 个答案:

答案 0 :(得分:2)

我使用符号链接

解决了这个问题
  1. 在app模块中创建符号链接keystore.lnk

    ln -s [path-to-keystore] keystore.lnk

  2. 然后在gradle.properties

    中使用<script> document.body.onload = function() {updateurl()}; function updateurl(){ window.history.replaceState(window.location.hostname, "Sample Title", window.location.pathname); } </script>

    RELEASE_STORE_FILE = keystore.lnk(不要使用引号)

  3. 现在您的gradle说明将有效。

答案 1 :(得分:1)

我最终使用了来自this网站的有趣解决方案。

我们的想法是将变量保存在存储在远程存储库的单独文件夹中。

~/.gradle/gradle.properties文件中输入:

Keys.repo=/Users/username/.signing

其中Keys.repo是远程存储库的本地路径。

稍后在/Users/username/.signing/YourProjectName.properties你有:

RELEASE_STORE_FILE=/YourProjectName/release.keystore //in fact it's a relative path
RELEASE_STORE_PASS=xxxxx
RELEASE_ALIAS=xxxxx
RELEASE_KEY_PASS=xxxxx

您需要将release.keystore文件存储在/Users/username/.signing/YourProjectName/release.keystore路径

配置按以下方式使用:

android {
    signingConfigs {
        debug { /* no changes - usual config style */ }
        release {
            if (project.hasProperty("Keys.repo")) {
                def projectPropsFile = file(project.property("Keys.repo") + "/YourProjectName.properties")
                if (projectPropsFile.exists()) {
                    Properties props = new Properties()
                    props.load(new FileInputStream(projectPropsFile))

                    storeFile file(file(project.property("Keys.repo") + props['RELEASE_STORE_FILE']))
                    storePassword props['RELEASE_STORE_PASS']
                    keyAlias props['RELEASE_ALIAS']
                    keyPassword props['RELEASE_KEY_PASS']
                }
            } else {
                println "======================================================="
                println "[ERROR] - Please configure release-compilation environment - e.g. in ~/.signing  directory"
                println "======================================================="
            }
        }
    }
}

答案 2 :(得分:0)

在那里找到解决方案:https://gist.github.com/gabrielemariotti/6856974

简而言之,您应该正确解析包含密钥库路径的文件。使用下一行修改您的模块的gradle。首先,这是如何基于keystore.properties文件内容创建signingConfigs:

signingConfigs
    {
        release
        {
            def Properties props = new Properties()
            def propFile = new File('path/to/your/keystore.properties') //absolute path to keystore.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
            {
                println 'keystore.properties found but some entries are missing'
                android.buildTypes.release.signingConfig = null
            }
        }
        else
        {
            println 'keystore.properties not found'
            android.buildTypes.release.signingConfig = null
        }
    }
}

然后将signingConfig添加到您的发布版本buildType:

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

此解决方案的keystore.properties文件示例:

STORE_FILE=absolute//path//to//store
STORE_PASSWORD=yourPass
KEY_PASSWORD=keysPass
KEY_ALIAS=aliasName

这对我有用(Android Studio 3.0.1,Gradle 4.1,Windows 10)。

答案 3 :(得分:0)

在我的例子 (macOS) 中,我的 local_store.keystore 保存在 Users/<username> 中,并且在 gradle.properties 文件中配置的密钥库路径为:

RELEASE_STORE_FILE=Users/<username>/local_store.keystore

我收到以下错误:

> Keystore file 
'/Users/<username>/Documents/MyProject/android/app/Users/<username>/local_store.keystore' 
not found for signing config 'release'.

所以 gradle.properties 中设置的路径被添加到 build.gradle 文件的相对路径中(注意重复 /Users/<username>)。

我通过使用几个 ../ 指定密钥库的路径来指向 Users/<username> 文件夹中的正确位置来解决这个问题。

它在 gradle.properties 文件中的外观:

RELEASE_STORE_FILE=../../../../../local_store.keystore

无需修改 build.gradle 文件。