在我的应用程序中,我有 2 个维度“应用程序”和“服务器”,其中我有 4 种风格。现在我想为不同的口味组合使用不同的版本代码。
例如:-
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..
}
}
versionCode 不能直接在 mergedFlavor 上设置。 可以使用以下命令为变体输出设置 versionCodeOverride 以下语法:
android { applicationVariants.all { variant -> variant.outputs.each { output -> output.versionCodeOverride = 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 输入的 VariantT 信息(例如,buildConfigFields)。仍可以修改表示为 org.gradle.api.provider.Property 的此类信息,确保 Android Gradle 插件创建的所有 org.gradle.api.Tasks 使用更新后的值。