Firma de sabores de productos con gradle

Estoy tirando a migrar mis proyectos a gradle. Uno de mis proyectos tiene varios sabores de producto y cada uno de ellos tiene que ser firmado con un signedConfig diferente en su versión de lanzamiento. Así que esto es lo que he intentado hasta ahora:

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 { ... } 

Cuando corro gradle build consigo una groovy.lang.MissingFieldException y el siguiente mensaje de error:

 No such field: signingConfigs for class: com.android.build.gradle.internal.dsl.GroupableProductFlavorFactory 

Asumo que el productFlavors. * Parte de la escritura del gradle no es el lugar derecho de poner configuraciones de la firma del código.

Por la guía del usuario , signatureConfigs para los sabores son compatibles.

El problema aquí tiene que ver con el alcance del objeto signedConfigs. Acabo de asignarlo a una variable dentro del bloque flavor1 , pero fuera del bloque flavor1 sabor para solucionar el problema:

 productFlavors { def flavor1SigningVariable = signingConfigs.flavor1 flavor1 { ... signingConfig flavor1SigningVariable ... } 

Usted puede declarar la signing config para cada flavor en buildType . Aquí está mi archivo gradle para los sabores de la firma de la liberación con diversos almacenes de la llave.

 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' } } } 

buildTypes bloque debe colocarse después de bloque de productFlavors , quiero decir orden es importante.

El plugin gradle para android sólo admite la firma por tipo de compilación, no por sabor. La razón de esto es que cualquier variante dada (tipo de construcción + sabores) sólo puede ser firmada por una clave, pero puede ser una combinación de varios grupos de sabor. Por ejemplo, sus grupos de sabor podría ser cpu (x86 / brazo) y versión (gratis / pagado), que es cuatro variantes diferentes a la derecha allí.

La solución que está buscando es crear tipos de compilación independientes para sus diferentes versiones de lanzamiento. Por ejemplo, los tipos de compilación pueden ser debug , release , release-beta , como esto:

 ... android { ... buildTypes { debug { signingConfig signingConfigs.debug } release { signingConfig signingConfigs.release } release-beta { initWith release signingConfig signingConfigs.release-beta } } } 

El initWith anterior dice gradle que release-beta debe ser una copia del tipo de compilación de release , sólo firmado con una clave diferente.

  • Quitar la biblioteca externa de clases obfuscated.jar (en Android Studio / Gradle)
  • La tarea Gradle no se ejecuta en Android Studio
  • Crashlytics con error de compilación de Android Studio
  • Cómo acelerar el proceso de compilación de Android Studio
  • Tela Beta y separaciones de APK
  • Tamaño APK es más grande de lo esperado - android studio
  • Android Gradle: ¿Qué es javaMaxHeapSize "4g"?
  • Android con Gradle (Java terminado con valor de salida no nulo 2)
  • Error Gradle - No se puede llamar IncrementalTask.taskAction () en la tarea ': project: mergeDebugResources'
  • Gradle no puede resolver todas las dependencias, url personalizado maven en la biblioteca
  • Android: No se pudo encontrar ni cargar la clase principal org.gradle.wrapper.GradleWrapperMain
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.