Je tyrannise de migrer mes projets vers gradle. Un de mes projets a plusieurs versions de produit et chacun d'entre eux doit être signé avec un signingConfig
différent dans sa version finale. Voici donc ce que j'ai essayé jusqu'à présent:
buildscript {
...
}
apply plugin: 'Android'
Android {
compileSdkVersion 17
buildToolsVersion '17'
signingConfigs {
flavor1 {
storeFile file("keystore")
storePassword "secret"
keyAlias "aliasForFlavor1"
keyPassword "secretFlavor1"
}
flavor2 {
storeFile file("keystore")
storePassword "secret"
keyAlias "aliasForFlavor2"
keyPassword "secretFlavor2"
}
}
productFlavors {
flavor1 {
signingConfig signingConfigs.flavor1
}
flavor1 {
signingConfig signingConfigs.flavor2
}
}
}
dependencies {
...
}
Quand je lance gradle build
J'ai un groovy.lang.MissingFieldException
et le message d'erreur suivant:
No such field: signingConfigs for class: com.Android.build.gradle.internal.dsl.GroupableProductFlavorFactory
Je suppose donc que la partie productFlavors
. * Du script Gradle n'est pas le bon endroit pour mettre des configurations de signature de code.
Selon le guide de l'utilisateur , la signature des configurations pour les saveurs est prise en charge.
Le problème ici a à voir avec la portée de l'objet signatureConfigs. Je viens de l'attribuer à une variable à l'intérieur du bloc productFlavors
, mais à l'extérieur du flavor1
bloc de saveur pour résoudre le problème:
productFlavors {
def flavor1SigningVariable = signingConfigs.flavor1
flavor1 {
...
signingConfig flavor1SigningVariable
...
}
Vous pouvez déclarer signing config
pour chaque flavor
dans buildType
. Voici mon fichier gradle pour les versions de signature de version avec différents magasins de clés.
Android {
signingConfigs {
configFirst {
keyAlias 'alias'
keyPassword 'password'
storeFile file('first.keystore')
storePassword 'password'
}
configSecond {
keyAlias 'alias'
keyPassword 'password'
storeFile file('second.keystore')
storePassword 'password'
}
}
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
minSdkVersion 14
targetSdkVersion 23
}
productFlavors{
flavor1 {
applicationId "com.test.firstapp"
}
flavor2 {
applicationId "com.test.secondapp"
}
}
buildTypes {
release {
productFlavors.flavor1.signingConfig signingConfigs.configFirst
productFlavors.flavor2.signingConfig signingConfigs.configSecond
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-Android.txt'),
'proguard-rules.pro'
}
}
}
Le bloc buildTypes
doit être placé après le bloc productFlavors
, je veux dire que l'ordre est important.
Le plugin gradle pour Android ne prend en charge que la signature par type de build, pas par saveur. La raison en est que tout variante (type de build + saveurs) ne peut être signé par une clé, mais peut être une combinaison de plusieurs groupes de saveurs. Par exemple, vos groupes de saveurs peuvent être cpu (x86/arm) et version (gratuit/payant), c'est quatre variantes différentes.
La solution que vous recherchez est de créer des types de build distincts pour vos différentes versions. Par exemple, vos types de build peuvent être debug
, release
, release-beta
, comme ça:
...
Android {
...
buildTypes {
debug {
signingConfig signingConfigs.debug
}
release {
signingConfig signingConfigs.release
}
release-beta {
initWith release
signingConfig signingConfigs.release-beta
}
}
}
Le initWith
ci-dessus indique simplement à gradle que release-beta
doit être une copie du type de construction release
, uniquement signée avec une clé différente.