20

所以我试图将我所有的 ant 构建脚本转换为 gradle,除了如何在 gradle.properties 文件中配置签名之外,我已经能够找到足够的资源和文档。

ant.properties 是这样的:

key.alias=alias
key.store.password=password
key.store=keystore.file
key.alias.password=password

但是我如何在gradle中做同样的事情?

4

6 回答 6

34

在您的gradle.properties文件中存储与ant.properties文件中相同的值,我认为您必须使用更简单的名称,keyAlias例如。只需删除这些点即可。

然后在您的build.gradle文件中执行以下操作:

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

if (project.hasProperty('keyAlias')) {
    android.signingConfigs.release.keyAlias = keyAlias
}
// do the same for the three other properties
// ...

这样做可以让您灵活地在具有或不具有gradle.properties文件的计算机上构建。“keyalias”属性只有在它存在时才会被读取,因此如果它不存在,代码不会失败。

如果所有属性都存在,signingConfigs.release则将完全配置并在构建期间用于对 apk 进行签名。如果它不存在,APK 将被构建但未签名。

于 2013-04-01T23:09:41.773 回答
22

我能够通过以下方式做到这一点。我尝试了@Xav 的解决方案,但如果我没有设置属性,它会在发布验证步骤中抱怨。由于框架发生了很大变化,我确信这是最近的变化。我只是想通过在最后指出else,我能够强制发布signingConfig 为空来提供帮助。现在签名和未签名版本都取决于 gradle.properties 的存在。

signingConfigs {
    release {
        keyAlias = "blue_sleep"
    }
}

buildTypes {
    release {
        signingConfig signingConfigs.release
    }
}

if (project.hasProperty('storeFile') &&
        project.hasProperty('storePassword') &&
        project.hasProperty('keyPassword')) {
    android.signingConfigs.release.storeFile = file(storeFile)
    android.signingConfigs.release.storePassword = storePassword
    android.signingConfigs.release.keyPassword = keyPassword
} else {
    android.buildTypes.release.signingConfig = null
}

其他一些有用的注释,如果您不希望它位于项目文件夹中,可以将 gradle.properties 放在 ~/.gradle/ 中。storeFile您也可以使用绝对路径设置属性,如下所示:storePath=file:///Users/nick/Dropbox/mycompany.keystore

于 2013-05-21T07:30:05.167 回答
6

受 Eugens 解决方案的启发,我想出了一个更短的方差。代码必须在 android {} 任务配置中。

File signFile = rootProject.file('sign.properties')
if (signFile.exists()) {
    Properties p = new Properties()
    p.load(new FileInputStream(signFile))
    signingConfigs {
        releaseConfig {
            storeFile file(p.storeFile)
            storePassword p.storePassword
            keyAlias p.keyAlias
            keyPassword p.keyPassword
        }
    }
    buildTypes.release.signingConfig signingConfigs.releaseConfig
}
于 2014-01-14T10:37:52.033 回答
4

Gradle 1.9 不允许您定义属性。您现在只能将它们添加到 ext。对先前答案的小补充:

signingConfigs {
    debug {
        project.ext.loadSign = false
    }
    release {
        project.ext.loadSign = true
    }
}

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

if ( project.ext.loadSign ) {
    Properties p = new Properties ()
    p.load ( new FileInputStream ( rootProject.file ( 'keys/sign.properties' ) ) )

    android.signingConfigs.release.storeFile file ( p.file )
    android.signingConfigs.release.storePassword p.password
    android.signingConfigs.release.keyAlias p.alias
    android.signingConfigs.release.keyPassword p.keyPassword
}
于 2014-01-10T06:36:19.997 回答
2

有一个很好的指南 - https://github.com/almalkawi/Android-Guide/wiki/Generating-signed-release-APK-using-Gradle

于 2014-01-17T03:38:39.530 回答
0

我的要求是任何没有密钥库的人都应该能够正确构建。这是我能找到的最干净的方法:

android {
    signingConfigs {
        release    //Filled in readSigningConfigIfAvailable()
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-xyz.txt'
            readSigningConfigIfAvailable()
        }
    }
}

private void readSigningConfigIfAvailable() {
    if (hasAllSigningProperties()) {
        android.signingConfigs.release.storeFile = file(keystore_path)
        android.signingConfigs.release.storePassword = keystore_password
        android.signingConfigs.release.keyAlias = key_alias
        android.signingConfigs.release.keyPassword = key_password
        android.buildTypes.release.signingConfig = android.signingConfigs.release
    } else {
        android.buildTypes.release.signingConfig = null
    }
}

private boolean hasAllSigningProperties() {
    (hasProperty('keystore_path')
    && hasProperty('keystore_password')
    && hasProperty('key_alias')
    && hasProperty('key_password'))
}
于 2015-12-09T05:23:18.833 回答