Конфигурации сборки на основе варианта приложения (BuildType + Flavor) - PullRequest
1 голос
/ 01 апреля 2020

Я пытаюсь установить signingConfig, manifestPlaceholders, buildConfigField для варианта приложения. Я могу установить их для каждого buildType или! productFlavor независимо, но мне нужно установить их на основе productFlavor и! buildType.

buildTypes{
  getByName("debug"){}
  getByName("release"){}
  create("staging"){}
}

productFlavors {
  create("global"){}
  create("local"){}
}

On В приведенном выше примере есть 3 разных типа buildTyps и 2 разных productFlavors. Это означает, что всего 6 вариантов APK. Для каждого из этих APK ( globalRelease, globalStaging, globalDebug, localRelease, localStaging, localDebug ) я хочу использовать, например, различные signatureConfig. Как мне установить его?

Попробовал:

  • Если я установлю его в buildType, то будет только 3 разных signatureConfigs
  • Если я установлю его во вкусе , тогда будет только 2 разных signatureConfigs
  • Если я попытаюсь установить его в applicationVariants.all{}, функции установщика не будет, только получатели для объекта Variant ( ссылка )
  • установка полей в (variant.mergedFlavor as DefaultProductFlavor) не добавляет значения buildConfigField в BuildConfig. java ( link )

1 Ответ

0 голосов
/ 02 апреля 2020

Чтобы внести изменения в разные варианты (buildType + productFlavor), мне пришлось использовать android.applicationVariants.all{}. Но для достижения нескольких signingConfig, manifestPlaceholders, buildConfigField

1) используются различные пути manifestPlaceholder

applicationVariants.all{
    val variant = this
}

Для * нет метода получения / установки 1012 * на variant объект. После this мы можем сделать variant.mergedFlavor изменяемым. Настройка manifestPlaceholders на variant.mergedFlavor сработала.

import com.android.builder.core.DefaultProductFlavor

applicationVariants.all{
    val manifestPlaceholders: Map<String, String>
    val variant = this
    val mutableMergedFlavor = variant.mergedFlavor as DefaultProductFlavor
    mutableMergedFlavor.addManifestPlaceholders(manifestPlaceholders)
}

2) buildConfigField

При использовании того же подхода вызов addBuildConfigField(ClassFieldImpl(type, name, value)) на mutableMergedFlavor не сработал Работа. Но вместо , он может быть установлен непосредственно на variant.

import com.android.builder.internal.ClassFieldImpl

applicationVariants.all{
    val buildConfigFields: List<ClassFieldImpl>
    val variant = this
    buildConfigFields.forEach { 
        variant.buildConfigField(it.type, it.name, it.value) 
    }
}

3) signatureConfig signingConfig может быть установлен на mutableMergedFlavor, показанном выше, кроме debug вариантов. Все варианты debug используют параметры подписи по умолчанию, даже если вы установили variant.mergedFlavor. Но если вы установите default как null, то вы также можете переопределить его.

import com.android.builder.core.DefaultProductFlavor

signingConfigs {
    create("myDebug") {}
}
buildTypes {
    getByName("debug") {
        signingConfig = null // to override
    }
}
applicationVariants.all{
    val variant = this
    val mutableMergedFlavor = variant.mergedFlavor as DefaultProductFlavor
    mutableMergedFlavor.signingConfig = signingConfigs.getByName("myDebug")
}

Чтобы собрать все вместе:

import com.android.build.gradle.api.ApplicationVariant
import com.android.builder.internal.ClassFieldImpl
import com.android.builder.model.SigningConfig
import com.android.builder.core.DefaultProductFlavor
import java.util.*

fun configureVariant(variant: ApplicationVariant,
                     signingConfig: SigningConfig,
                     buildConfigFields: List<ClassFieldImpl>,
                     manifestPlaceholders: Map<String, String>) {

    println("configureVariant: ${variant.name}")
    buildConfigFields.forEach {
        variant.buildConfigField(it.type, it.name, it.value)
    }

    val mutableMergedFlavor = variant.mergedFlavor as DefaultProductFlavor
    mutableMergedFlavor.signingConfig = signingConfig
    mutableMergedFlavor.addManifestPlaceholders(manifestPlaceholders)
}

android {
    signingConfigs {
        create("myDebug") {}
        create("myRelease") {}
    }

    flavorDimensions("region")
    productFlavors {
        create("global") {
            setDimension("region")
            setApplicationId("")
        }
        create("local") {
            setDimension("region")
            setApplicationId("")
        }
    }

    buildTypes {
        getByName("debug") {
            signingConfig = null
        }
    }

    applicationVariants.all {
        val variant = this
        when {
            variant.name.equals("localDebug", true) -> {
                configureVariant(
                        variant,
                        signingConfigs.getByName("localDebug"),
                        listOf(ClassFieldImpl("String", "NAME", "\"VALUE\"")),
                        mapOf("KEY" to "VALUE")
                )
            }
            variant.name.equals("globalStaging", true) -> {
                configureVariant(
                        variant,
                        signingConfigs.getByName("globalStaging"),
                        listOf(ClassFieldImpl("String", "NAME", "\"VALUE2\"")),
                        mapOf("KEY" to "VALUE2")
                )
            }
        }
    }
}

...