Android Studio中的Gradle Flavor Dimensions构建变体无法正常工作

25

我有一个应用程序的两个维度,称之为绿色和蓝色。只会有这两个维度,但产品口味数量是无限的。这就是我在Gradle中设置它的方式。

flavorDimensions "green", "blue"

productFlavors {

    one {
        applicationId "com.app.green.one"
        versionCode 1
        versionName "1.0.0.1";
        flavorDimension = "green"
    }
    two {
        applicationId "com.app.blue.two"
        versionCode 6
        versionName "1.0.1";
        flavorDimension = "blue"
    }
}

但是在同步Gradle之后,构建变体选项卡中我只看到了oneTwoDebug和oneTwoRelease,而应该看到greenOneDebug,greenOneRelease,blueTwoDebug和blueTwoRelease。

理论上,我想将其扩展为像这样的形式。

one {
    applicationId "com.app.green.one"
    versionCode 1
    versionName "1.0.0.1";
    flavorDimension = "green"
}
two {
    applicationId "com.app.blue.two"
    versionCode 6
    versionName "1.0.1";
    flavorDimension = "blue"
}
three {
    applicationId "com.app.green.three"
    versionCode 1
    versionName "1.0.0.1";
    flavorDimension = "green"
}
four {
    applicationId "com.app.blue.four"
    versionCode 6
    versionName "1.0.1";
    flavorDimension = "blue"
}

在此案例中,维度代表应用程序的“类型”,而口味则更多地用于可以添加的组织。

**编辑我对Gradle的设置有误,正如在这里指出的那样,这是我更准确的描述

flavorDimensions "type", "organization"

productFlavors {

    blue {
        applicationId "com.app.blue"
        flavorDimension = "type"
        versionCode 6
        versionName "1.0.1";
    }
    red {
        applicationId "com.app.red"
        flavorDimension = "type"
        versionCode 1
        versionName "1.0.0.1";
    }

    company1 {
        flavorDimension = "organization"
    }
    company2 {
        flavorDimension = "organization"
    }
}

到目前为止这是有效的,所以我可以为切换类型创建Java源目录,但是如果我想要组织特定的配置文件,我是否也要为每个组织创建Java源目录?

1个回答

43

我认为你误解了flavorDimension的概念。

flavorDimension类似于口味分类,而每个口味类别的组合都将产生一个变体。

在你的情况下,你必须定义一个名为"type"的flavorDimension和另一个名为"organization"的维度。对于维度“organization”中的每种口味,它都会产生所有可能的“type”(或者是双重构成:对于每个“type”,它都会为每个组织机构产生一种变体)。

口味维度定义了将用于生成变体的笛卡尔积


编辑:我将尝试用伪gradle代码说明:

让我们定义一些"type":青铜、白银和黄金

让我们定义一些组织机构:customerA,customerB,customerC

所有这些都是productFlavors,但它们属于2个不同的维度:

flavorDimensions("type_line", "organization")
productFlavors {

    gold {
        ...
        dimension = "type_line"
    }
    silver {
        ...
        dimension = "type_line"
    }
    bronze {
         ...
        dimension = "type_line"
    }

     customerA {
        ...
        dimension = "organization"
    }
    customerB {
        ...
        dimension = "organization"
    }
    customerC {
         ...
        dimension = "organization"
    }

}

如果您有标准的构建类型:debug和release,那么此配置将产生18个变体(3*3*2):

gold-customerA-debug ; gold-customerA-release ; gold-customerB-debug ; gold-customerB-release ; gold-customerC-debug ; gold-customerC-release ;

silver-customerA-debug ; silver-customerA-release ; silver-customerB-debug ; silver-customerB-release ; silver-customerC-debug ; silver-customerC-release ;

... (铜牌等级相同)

请注意,维度的名称是完全任意的,并不影响变体的名称。

风味维度非常强大,但如果使用太多:会导致变体数量的指数爆炸(后置构建清理任务可能有用于删除无用或无意义的变体)。


这样说有点更合理了,但每个产品口味都需要定义一个口味维度,如果每种口味都是两者的组合,那该怎么处理? - Brian
1
我想我真正想做的是在某种程度上替换口味。 - Brian
谢谢你的示例!在你之前的评论后,我终于弄明白了它是如何工作的,这让我更加理解了。如果可以的话,我还有一个最后一个问题,如果我想为组织创建一个配置文件,每个组织是否需要自己的Java源目录?或者组织配置必须放置在“类型”配置中?这样说清楚了吗? - Brian
您可以在/src/flavorName/java(相应的src/flavorName/res和src/flavorName/assets)下为每个产品口味创建额外的java /,res /或assets /目录,并且每个变体都将包括src/main/下的源以及src/flavorName/下的源。(我无法理解您所说的“放置在类型配置中”的含义) - ben75
是的,我想太多了,我也这样做了,谢谢你的帮助。 - Brian
2
@ben75,不要使用“清理任务”,而是使用variantFilter块来减少变体数量并排除无用的组合。 - Murmel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接