为不同风格维度组合设置不同的 versionCode [Kotlin DSL]

Set different versionCode for different flavors dimension combination [Kotlin DSL]

提问人:Akrit Khanna 提问时间:11/14/2023 最后编辑:Akrit Khanna 更新时间:11/19/2023 访问量:46

问:

在我的应用程序中,我有 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
        }
    } 
} 

现在我没有想法了,任何形式的帮助都将不胜感激。

安卓 kotlin android-gradle-plugin gradle-kotlin-dsl

评论

0赞 Lionel Briand 11/14/2023
如果尺寸不同,是否还需要不同的版本代码?声明flavors versionCode为var时,可以直接设置versionCodeproductFlavors { create("Appone") { versionCode = 123 } }
0赞 Akrit Khanna 11/14/2023
@LionelBriand 我想要不同口味组合的不同版本代码。我知道我可以直接在产品风格中设置版本代码,但这不是我想要的。
0赞 Lionel Briand 11/14/2023
从你放的gradle错误。我发现applicationVariants.configureEach { outputs.configureEach { (this as com.android.build.gradle.api.ApkVariantOutput).versionCodeOverride = 123 } }
0赞 Akrit Khanna 11/15/2023
@LionelBriand 它有效但已被弃用,您知道其他选择吗?
0赞 Lionel Briand 11/15/2023
不,我不知道任何其他选择。

答:

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 都使用更新后的值。