所以我正在尝试将我的所有ant构建脚本转换为gradle,并且除了如何在gradle.properties文件中配置签名之外,我已经能够找到所有这些资源和文档。
ant.properties就是这样:
key.alias=alias
key.store.password=password
key.store=keystore.file
key.alias.password=password
但我如何在gradle中做同样的事情?
答案 0 :(得分:33)
在 gradle.properties 文件中存储与 ant.properties 文件中相同的值,我认为您必须执行更简单的名称,例如{{1 }} 例如。只需删除点即可。
然后在 build.gradle 文件中执行以下操作:
keyAlias
这样做可以让您灵活地在具有 gradle.properties 文件的计算机上构建。 “keyalias”属性只有在存在时才会被读取,因此如果代码不存在则代码不会失败。
如果所有属性都存在,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
// ...
将完全配置,并将在构建期间用于签署apk。如果它不在那里,APK将被构建但不会签名。
答案 1 :(得分:22)
我能够用以下方法做到这一点。我尝试了@ Xav的解决方案,但如果我没有设置属性,它会在发布验证步骤中抱怨。我确信这是最近的变化,因为框架发生了很大的变化。我只想指出最后使用else
,我能够强制释放signingConfig为null。现在签名和未签名的版本都会发生,具体取决于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
答案 2 :(得分:5)
受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
}
答案 3 :(得分:3)
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
}
答案 4 :(得分:2)
有一个很好的指南 - https://github.com/almalkawi/Android-Guide/wiki/Generating-signed-release-APK-using-Gradle
答案 5 :(得分: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'))
}