Конфигурация подписи варианта сборки Android

У меня есть следующее в моем модуле приложения Android файл build.gradle.

android {

    defaultConfig {
        ...
    }

    signingConfigs {
        if (System.getEnv()['CIRCLE-CI']) { /* CI System */
            localMachine { /* CI System KeyStore file and properties. */
                ...
                keyAlias = "ABC"
            }
            playStore { /* CI System KeyStore file and properties. */
                ...
                keyAlias = "ABC"
            }
        } else { /* Local machine, not CI System. */
            localMachine { /* debug.keystore local file and properties. */
                ...
                keyAlias = "androiddebugkey"
            }
            playStore { /* debug.keystore local file and properties. */
                ...
                keyAlias = "androiddebugkey"
            }
        }
    }

    productFlavors {
        productOne {
            ...
        }
        productTwo {
            ...
        }
    }

    buildTypes {
        debug {
            ...
        }
        release {
            ...
        }
    }
}

/** This is where the problem is **/
android.applicationVariants.all { variant -> 
        if (variant.mergedFlavor.name == "productOne") {
            if (variant.buildType.name == "debug") {
                variant.signingConfig android.signingConfigs.localMachine
            } else if (variant.buildType.name == "release") {
                variant.signingConfig android.signingConfigs.playStore
            }
        } else if (variant.mergedFlavor.name == "productTwo") {
            if (variant.buildType.name == "debug") {
                variant.signingConfig android.signingConfigs.localMachine
            } else if (variant.buildType.name == "release") {
                variant.signingConfig null
            }
        }
    }
}

Ожидаемый результат следующий.

productOneDebug -> Sign with signingConfigs.localMachine
productTwoDebug -> Sign with signingConfigs.localMachine
productOneRelease -> Sign with signingConfigs.playStore
productTwoRelease -> Unsigned.

Фактический вывод выглядит следующим образом.

productOneDebug -> Signed with signingConfigs.localMachine
productTwoDebug -> Signed with signingConfigs.localMachine
productOneRelease -> Unsigned.
productTwoRelease -> Unsigned.

Почему релиз apks всегда без подписи? Намерение состоит в том, чтобы ProductTwo Release apk оставался без подписи, но ProductOne Release apk должен быть подписан в зависимости от заданной конфигурации.

1 ответ

По-видимому, это то, что происходит во время Gradle Sync.

Variant.signingConfig является Перезаписанным механизмом как Flavor, так и Build-type, в том же порядке, в зависимости от того, существует ли значение.

productOne.signingConfig = playStore
productTwo.signingConfig = null
debug.signingConfig = localMachine
release.signingConfig = null

И получившиеся варианты будут -

productOneDebug.signingConfig = productOne.signingConfig 

переписано debug.signingConfig

productTwoDebug.signingConfig = productTwo.signingConfig

переписано debug.signingConfig

productOneRelease.signingConfig = productOne.signingConfig 

переписано release.signingConfig если существует.

productTwoRelease.signingConfig = productTwo.signingConfig 

переписано release.signingConfig если существует.

Другие вопросы по тегам