web-dev-qa-db-fra.com

Signature des saveurs des produits avec gradle

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.

54
user2473760

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
        ...
    }
44
c2knaps

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.

64
ashakirov

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.

7