簡體   English   中英

Android - 根據構建類型更改風味版本名稱

[英]Android - change flavor version name based on build type

我想更改應用程序風格的版本名稱,但前提是它是調試版本。

(例如,調試版本將具有 1.0.1 D (DEBUG) 555 或 1.0.1 P (DEBUG) 555 之類的版本,但是我希望發布版本僅具有 1.0.1 之類的版本)我該如何實現?

基本上我有這些構建類型:

buildTypes {


    debug {
        versionNameSuffix " (DEBUG) " + mBuild

    }
    release {
        runProguard true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), file('proguard-project.txt')
        signingConfig signingConfigs.release
    }
}

和這些口味(針對不同的 api 環境):

productFlavors {
    dev {
        versionName = android.defaultConfig.versionName + " D"
    }
    prod {
        versionName = android.defaultConfig.versionName + " P"
    }
}

有什么方法可以在不更改產品風味版本名稱的情況下制作發布版本嗎?

我試圖通過動態設置版本名稱

    buildTypes.each { buildType ->
    if(buildType.name == 'debug') {
        productFlavors.dev.versionName = android.defaultConfig.versionName + " D"
    }
}

但這導致

在 GroupableProductFlavorDsl 容器上找不到屬性“dev”。

經過數小時的搜索,我設法使用此代碼刪除了對發布版本的版本名稱所做的所有更改

applicationVariants.all { variant ->
    if (variant.buildType.name == 'release') {
        variant.mergedFlavor.versionName = android.defaultConfig.versionName;
    }
}

對於那些想通過 Kotlin DSL 使用它的人。 第一次嘗試時,它可能不允許我們為版本名稱分配新值。

在此處輸入圖片說明

上圖顯示了ProductFlavor類的versionName沒有設置器。

嘗試 1(轉換為ProductFlavorImpl ):

applicationVariants.forEach { variant ->
  if (variant.buildType.name != "release") {
    variant.mergedFlavor.let {
      it as ProductFlavorImpl
      it.versionName = "sampingan-${defaultConfig.versionName}"
    }
  }
}

it as ProductFlavorImpl仍然不起作用,因為MergedFlavor無法轉換ProductFlavorImpl並拋出此錯誤:

com.android.builder.core.MergedFlavor cannot be cast to com.android.build.gradle.internal.api.dsl.model.ProductFlavorImpl

嘗試 2(轉換為MergedFlavor ):

  //
  variant.mergedFlavor.let {
    it as com.android.builder.core.MergedFlavor
  }
  // 

經過反復試驗,看起來我們無法直接使用MergedFlavor更改versionName ,而是另一個錯誤日志如下所示:

versionName cannot be set on a mergedFlavor directly.
versionNameOverride can instead be set for variant outputs using the following syntax:
android {
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            output.versionNameOverride = "1.0.0"
        }
    }
}

嘗試 3(使用ApplicationVariant對象):

所以讓我們把我們的實現改成這樣

    applicationVariants.all(object : Action<com.android.build.gradle.api.ApplicationVariant> {
        override fun execute(variant: com.android.build.gradle.api.ApplicationVariant) {
            println("variant: ${variant}")
            variant.outputs.all(object : Action<com.android.build.gradle.api.BaseVariantOutput> {
                override fun execute(output: com.android.build.gradle.api.BaseVariantOutput) {

                    if (variant.buildType.name != "release") {
                    (output as com.android.build.gradle.internal.api.ApkVariantOutputImpl)
                            .versionNameOverride = "prefix-${variant.versionName}"
                    }
                }
            })
        }
    })

這整個方法的靈感來自@david-mihola 的回答。 他解釋說, groovy在這里有它自己的魔力。

如果您想為每個不同的buildTypesproductFlavors更改APK 名稱,您可以在此處訪問 @david-mihola 答案。

Build Type應該覆蓋Product Flavor 試試下一個。

buildTypes {

    release {
        versionName = android.defaultConfig.versionName
    }
}

最新的簡單解決方案運行良好並經過測試。 在其中定義 productflavour 和 buildTypes 並刪除 versionName。

使用output.versionNameOverride = versionName我們可以根據 buildType 和 productFlavour 更改 versionName。

代碼:

 applicationVariants.all { variant ->
    variant.outputs.all { output ->
        def flavor = variant.getFlavorName()
        def versionName = "1.0.0"
        switch (flavor){
            case "paid":
                flavor = "Paid"
                if (variant.buildType.name == 'release') {
                    versionName = "1.0.0.8"
                } else if (variant.buildType.name == 'staging') {
                    versionName = "1.0.0.8"
                } else {
                    versionName = "1.0.0.8"
                }
                break
            case "free":
                flavor = "Free"
                if (variant.buildType.name == 'release') {
                    versionName = "1.0.0.14"
                } else if (variant.buildType.name == 'staging') {
                    versionName = "1.0.0.14"
                } else {
                    versionName = "1.0.0.14"
                }
                break
            case "trial":
                flavor = "Trial"
                if (variant.buildType.name == 'release') {
                    versionName = "1.0.0.3"
                } else if (variant.buildType.name == 'staging') {
                    versionName = "1.0.0.3"
                } else {
                    versionName = "1.0.0.3"
                }
                break
        }
        output.versionNameOverride = versionName
        outputFileName = "${flavor}_v${versionName}.apk"
    }
}

我想為調試版本設置一個不同的versionName

android {
    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            if (variant.buildType.name == 'debug') {
                output.versionNameOverride = "1"
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM