android - 如何在 Kotlin Gradle DSL 的 applicationVariants 中更新 manifestPlaceholders?
问题描述
我尝试将其转换为 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 中的风味,这就是您需要 applicationVariants 的原因。
解决方案
我必须更改上面的一些内容才能使其正常工作:
- 风味图(此处为 appLabelMap)必须进入 applicationVariants,因此您可以立即使用它。
- ManifestPlaceHolders 确实是一个 val,但您可以替换地图中的值。:)
- applicationVariants.forEach 没有被执行,所以你必须使用 applicationVariants.all。但请注意,它与 koltin.collections.all() 发生冲突(有点),因此您必须使用带有 Action 的闭包而不是闭包。
这是最终结果:
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]}"
}
您还必须在 android.defaultConfig 中为 applicationLabel 设置默认值:
android.defaultConfig { manifestPlaceholders["applicationLabel"] = "FlavorA"}
这是AndroidManifest.xml的相关部分,以防万一不清楚:
<application
android:label="${applicationLabel}"
...
<activity
...>
...
</activity>
...
</application>
一旦你知道怎么做,它看起来很容易!
推荐阅读
- javascript - 如何测试在 react-testing-library 中调用了函数 prop
- wordpress - 如何将支付方式端点添加到 Woocommerce 中的帐户导航?
- php - Flutter http post请求返回html而不是json
- pandas - 根据来自另一个数据帧的多个条件从一个数据帧计算描述性统计数据
- c# - 通过制表符保存数据
- json - 数据库包含字符串中的引号,需要在 json 中使用,这会导致解析错误
- bazel - 如何确保构建不依赖于两个不同版本的外部依赖?
- arrays - 在C中的循环中覆盖全局char数组与全局char指针
- react-native - 从 React-Native 应用程序在 Facebook 应用程序中分享 URL 作为帖子
- javascript - 在 Typescript 中,`return x` 和 `return await x` 之间有区别吗?