Подписание продуктов с помощью gradle
Я использую 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. * часть gradle script не подходит для размещения конфигураций подписи кода.
Ответы
Ответ 1
В руководстве поддерживается поддержка подписки на совместимость.
Проблема здесь связана с объемом объекта signatureConfigs. Я просто назначил его переменной внутри блока productFlavors
, но вне блока аромата flavor1
, чтобы исправить проблему:
productFlavors {
def flavor1SigningVariable = signingConfigs.flavor1
flavor1 {
...
signingConfig flavor1SigningVariable
...
}
Ответ 2
Вы можете объявить signing config
для каждого 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
, я имею в виду, что порядок важен.
Ответ 3
Плагин gradle для андроида поддерживает только подписи для каждого типа сборки, а не для каждого аромата. Причиной этого является то, что любой данный вариант (тип сборки + флейворы) может быть подписан только одним ключом, но может быть комбинацией нескольких групп вкуса. Например, ваши группы вкуса могут быть процессором (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
, только подписанным с другим ключом.