提问人:Akrit Khanna 提问时间:11/14/2023 最后编辑:Akrit Khanna 更新时间:11/19/2023 访问量:46
为不同风格维度组合设置不同的 versionCode [Kotlin DSL]
Set different versionCode for different flavors dimension combination [Kotlin DSL]
问:
在我的应用程序中,我有 2 个维度“应用程序”和“服务器”,其中我有 4 种风格。现在我想为不同的风格组合使用不同的版本代码。
例如:-
- 对于 ApponeLive,我希望有 versionCode 1。
- 对于 ApponeStaging,我想要 versionCode 2。
build.gradle.kts
flavorDimensions.add("app")
flavorDimensions.add("server")
productFlavors {
create("Appone") {
val appName = "App One"
applicationId = "com.app.one"
dimension = "app"
resValue("string", "appName", appName)
manifestPlaceholders["launcherName"] = appName
}
create("Apptwo") {
val appName = "App Two"
applicationId = "com.app.two"
dimension = "app"
resValue("string", "appName", appName)
manifestPlaceholders["launcherName"] = appName
}
create("live") {
dimension = "server"
manifestPlaceholders["appNameSuffix"] = ""
}
create("staging") {
dimension = "server"
applicationIdSuffix = ".staging"
versionNameSuffix = "-staging"
manifestPlaceholders["appNameSuffix"] = " Staging"
}
}
我尝试使用“applicationVariants.configureEach { }”设置版本代码,但versionCode是val,这意味着它不能重新分配。
根据“ProductFlavor.kt”
与此风格关联的版本代码或 null(如果没有) 设置。这只是此产品口味上设置的值,而不是 必须是实际使用的版本代码。
applicationVariants.configureEach {
val app = productFlavors[0].name
val server = productFlavors[1].name
if (app == "Appone" && server == "live"){
mergedFlavor.versionCode = 1
}else if (app == "Appone" && server == "staging"){
mergedFlavor.versionCode = 2
}else {
//Do something..
}
}
我什至尝试通过铸造“MergedFlavor”来尝试,但它导致 gradle 任务失败并显示了这一点,我认为这是针对 Groovy 的。
applicationVariants.configureEach {
val app = productFlavors[0].name
val server = productFlavors[1].name
if (app == "Appone" && server == "live"){
(mergedFlavor as MergedFlavor).versionCode = 1
}else if (app == "Appone" && server == "staging"){
(mergedFlavor as MergedFlavor).versionCode = 2
}else {
//Do something..
}
}
Gradle 错误
versionCode 不能直接在 mergedFlavor 上设置。 versionCodeOverride 可以改为使用 语法如下:
android { applicationVariants.all { variant -> variant.outputs.each { output -> output.versionCodeOverride = 1 } } }
现在我没有想法了,任何形式的帮助都将不胜感激。
答:
0赞
Akrit Khanna
11/19/2023
#1
经过一番研究,我想出了这个,它对我有用,但我不确定它是否是最佳解决方案。
如果可以进行任何优化,请告诉我。
android {
androidComponents.onVariants {
val app = it.productFlavors[0].second
val server = it.productFlavors[1].second
val output = it.outputs.firstOrNull() ?: return@onVariants
if (app == "Appone" && server == "live"){
output.versionCode.set(1)
}else if (app == "Appone" && server == "staging"){
output.versionCode.set(2)
}else {
//Add your logic
}
}
}
解释
fun onVariants(
selector: VariantSelector = selector().all(),
callback: (VariantT) -> Unit
)
在回调中执行的代码还可以访问用于配置 org.gradle.api.Task 输入(例如 buildConfigFields)的 VariantT 信息。表示为 org.gradle.api.provider.Property 的此类信息仍可修改,以确保 Android Gradle 插件创建的所有 org.gradle.api.Tasks 都使用更新后的值。
评论
productFlavors { create("Appone") { versionCode = 123 } }
applicationVariants.configureEach { outputs.configureEach { (this as com.android.build.gradle.api.ApkVariantOutput).versionCodeOverride = 123 } }