Подписывание ароматов продуктов с помощью градиента

Я использую tyring для переноса моих проектов в gradle. Один из моих проектов имеет несколько вкусов продукта, и каждый из них должен быть подписан с другим signConfig в своей версии. Так вот что я пробовал до сих пор:

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

Когда я запускаю конструкцию gradle build я получаю groovy.lang.MissingFieldException и следующее сообщение об ошибке:

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

Поэтому я предполагаю, что productFlavors. * Часть сценария градации не является подходящим местом для размещения конфигураций подписи кода.

В руководстве пользователя поддерживается подписка на совместимость для ароматизаторов.

Проблема здесь связана с объемом объекта signConfigs. Я просто назначил его переменной внутри блока productFlavors , но вне flavor1 аромата flavor1 чтобы исправить проблему:

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

Вы можете объявить buildType для каждого flavor в buildType . Вот мой файл gradle для разблокировки подписей с различными хранилищами ключей.

 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 должен быть размещен после блока productFlavors , я имею в виду, что порядок важен.

Плагин gradle для android поддерживает только подписи для каждого типа сборки, а не для каждого аромата. Причиной этого является то, что любой данный вариант (тип сборки + флейворы) может быть подписан только одним ключом, но может быть комбинацией нескольких групп вкуса. Например, ваши группы вкуса могут быть процессором (x86 / arm) и версией (бесплатно / платно), это четыре разных варианта.

Решение, которое вы ищете, – это создание отдельных типов сборки для разных версий выпуска. Например, ваши типы сборки могут быть debug , release , release-beta , например:

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

initWith выше просто говорит gradle, что release-beta должна быть копией типа сборки release , только подписанного с другим ключом.