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:
- Enlace de datos de Android: No se puede resolver el símbolo
- Advertencias de gradol y roboguice 2.0 de Android
- Error: "El proceso de daemon recién creado tiene un contexto diferente del esperado"
- libGDX + com.google.android.gms: play-services: 7.0.0: android: dexDebug
- Android gradle La ruta local no existe
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.
- Androidmanifest xml no existe o tiene una etiqueta raíz incorrecta
- Gradle lanzando error en los números de versión en cordova config.xml
- Ejecución fallada para la tarea: app: compileDebugJavaWithJavac en Android Studio
- Gradle "manifiesto requiere un sustituto de posición" error, pero manifestPlaceholders suministra un valor
- Recibir un error de compilación al actualizar a gradle 3.3 y android build tools 2.3.0
- ¿Utiliza Android Studio Gradle Daemon?
- ¿Hay alguna manera de ejecutar un conjunto específico de pruebas en un proyecto de Android Gradle?
- Android Studio 0.5.0 - No hay auto código de terminación y el reconocimiento de sintaxis de errores después de actualizar
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.
- Android Studio: crea un proyecto Java sin dependencias de Android
- ¿Cómo puedo obtener el nombre del dispositivo en Android?