Подтвердить что ты не робот

Подписание продуктов с помощью 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 не подходит для размещения конфигураций подписи кода.

4b9b3361

Ответ 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, только подписанным с другим ключом.