android 不同的 applicationId 和 applicationIdSuffix by flavors chains

android different applicationId & applicationIdSuffix by flavors chains

提问人:alrama 提问时间:4/7/2023 最后编辑:alrama 更新时间:4/14/2023 访问量:626

问:

我有 2 个目标 android 风格,有 2 个不同的客户风格。 我需要:

  1. 第一个具有 appId 和不同后缀(按客户)的目标
  2. 第二个目标具有不同的 appId,不带任何后缀。

我的尝试:

flavorDimensions "customer","target"
productFlavors {
    customerA {
        dimension "customer"
        applicationId = "com.mycompany.newappname.customerA"
    }
    customerB {
        dimension "customer"
        applicationId = "com.mycompany.newappname.customerB"
    }
    targetA{
        dimension "target"
    }
    targetB{
        dimension "target"
        applicationId = "com.mycompany.oldappname"
    }
}

它不适用于 targetB。我在维度客户中定义了 appId,而不是在维度目标中定义了 appId。

我试过了:

defaultConfig {
    applicationId "com.mycompany.newappname"
}
...
flavorDimensions "customer","target"
productFlavors {
    customerA {
        dimension "customer"
        applicationIdSuffix = ".customerA"
    }
    customerB {
        dimension "customer"
        applicationIdSuffix = ".customerB"
    }
    targetA{
        dimension "target"
    }
    targetB{
        dimension "target"
        applicationIdSuffix = ""
        applicationId = "com.mycompany.oldappname"
    }
}

但我得到结果 targetB appId= “com.mycompany.oldappname.customerB”

编辑

我在 targetA 和 targetB 都需要的 companyA/companyB 的文件夹 java/res 中有专门的代码

android gradle build.gradle android-productflavors

评论

0赞 Rinat Diushenov 4/13/2023
为什么没有在 targetB 风格中设置维度“target”?
0赞 alrama 4/13/2023
你是对的@RinatDiushenov,我刚刚纠正了这一点。由于信息的隐私性,我重命名并剥离了缺少的风味代码。

答:

3赞 Elizabeth 4/7/2023 #1

客户维度似乎只参与 targetA。 也许,您需要没有任何客户维度的 targetB。 因此,我会尝试按目标维度为默认客户和 variantFilter 添加新风格。

    flavorDimensions "target", "customer"
    productFlavors {
        targetA {
            dimension "target"
            applicationId = "com.mycompany.newappname"
        }
        targetB {
            dimension "target"
            applicationId = "com.mycompany.oldappname"
        }
        customerUndefined {
            dimension "customer"
        }
        customerA {
            dimension "customer"
            applicationIdSuffix = ".customerA"
        }
        customerB {
            dimension "customer"
            applicationIdSuffix = ".customerB"
        }
    }


    variantFilter { variant ->
        def names = variant.flavors*.name
        switch (variant) {
            case { names.contains("targetA") and names.contains("customerUndefined") }:
                setIgnore(true)
                break
            case { names.contains("targetB") and names.contains("customerA") }:
                setIgnore(true)
                break
            case { names.contains("targetB") and names.contains("customerB") }:
                setIgnore(true)
                break
            default:
                break
        }
    }

评论

0赞 alrama 4/7/2023
我不知道 setIgnore 是做什么的,但您的解决方案对我来说可能很好。为targetA构建时,我应该选择“releaseTargetACustomerUndefined”。明天我会试一试。
0赞 Elizabeth 4/7/2023
构建变体的结果列表是维度和构建类型的组合。在这里,我添加了新客户,无需修改。 允许将构建类型静音。 block 将 customerA 和 customerB 排除在 targetB 之外,将 customerUndefined 排除在 targetA 之外。因此,您将有 3 个发布变体:targetACustomerARelease、targetACustomerBRelease、targetBCustomerUndefinedRelease。applicationIdSuffixsetIgnore()variantFilter
0赞 alrama 4/7/2023
也许我不能使用你的解决方案。在为 targetB 构建时,我也需要从 companyA 和 companyB java/res 文件夹中选择源代码,但选择 companyUndefined 不包括此
0赞 alrama 4/20/2023
我必须分配赏金。我把它给你,因为不能把它交给我自己的答案。
1赞 alrama 4/14/2023 #2

找到解决方案,在这个答案和另一个答案的基础上发展

applicationVariants.all { variant ->
        variant.outputs.each { output ->
            if (variant.productFlavors[1].name.equals("targetb")) {
                variant.mergedFlavor.applicationId = "com.mycompany.oldappname"
            } else if (variant.productFlavors[0].name.equals("companya")) {
                variant.mergedFlavor.applicationId = "com.mycompany.newappname.companya"
            } else if (variant.productFlavors[0].name.equals("companyb")) {
                variant.mergedFlavor.applicationId = "com.mycompany.newappname.companyb"
            }
        }
}