Как обновить manifestPlaceholder в applicationVariants в Kotlin Gradle DSL? - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь преобразовать это в Kotlin:

applicationVariants.all { variant ->
    def flavor = variant.productFlavors[0]
    def mergedFlavor = variant.getMergedFlavor()
    mergedFlavor.manifestPlaceholders = [applicationLabel: "${variant.buildType.appName[flavor.name]}"]
}

Но manifestPlaceholder является значением val и не может быть переназначен, поэтому это приводит к ошибке:

applicationVariants.forEach {variant->
    val flavor = variant.productFlavors[0]
    val mergedFlavor = variant.mergedFlavor
    variant.mergedFlavor.manifestPlaceholders = mapOf("applicationLabel" to "${variant.buildType.appName[flavor.name]}")
}

Обычно Я мог бы установить это в замыкании buildTypes, но я не могу сделать это здесь, потому что appName - это карта в buildTypes, где ключом является имя флейвора, поэтому applicationLabel зависит как от типа сборки, так и от флейта. И я думаю, что вы не можете получить доступ к вариантам в buildTypes, поэтому вам нужны варианты приложения.

1 Ответ

0 голосов
/ 22 января 2020

Мне пришлось изменить несколько вещей в вышеприведенном, чтобы он работал:

  1. Карта вкуса (здесь appLabelMap) должна go в applicationVariants, так что вы можете использовать ее сразу.
  2. ManifestPlaceHolders действительно является значением val, но вы можете заменить значения на карте. :)
  3. applicationVariants.forEach не выполняется, поэтому вы должны использовать applicationVariants.all. Но имейте в виду, что он конфликтует (вроде как) с koltin.collections.all (), поэтому вместо замыкания вы должны использовать тот, который выполняет действие.

Это конечный результат:

applicationVariants.all {
    val appLabelMap = when (this.buildType.name) {
        "debug" -> mapOf("flavorA" to "FlavorA Debug", "flavorB" to "FlavorB Debug")
        ...
        else -> mapOf("flavorA" to "FlavorA", "flavorB" to "FlavorB")
    }
    val flavor = this.productFlavors[0]
    this.mergedFlavor.manifestPlaceholders["applicationLabel"] = "${appLabelMap[flavor.name]}"
}

Вы также должны установить значение по умолчанию для applicationLabel в android .defaultConfig:

android.defaultConfig { manifestPlaceholders["applicationLabel"] = "FlavorA"}

Это релевантная часть AndroidManifest. xml, на всякий случай, если это не так ясно:

<application
     android:label="${applicationLabel}"
     ...
     <activity
     ...>
     ...
     </activity>
     ...
</application>

Если вы знаете, как это сделать, это выглядит просто!

...