如何根据两种不同的风味尺寸设置我的Android应用包名称?

时间:2014-05-15 19:38:23

标签: android android-gradle

我正在使用Gradle插件构建我的Android应用程序。我正在使用flavors功能创建四种不同的变体。目前,它是具有四个值的单个维度,但将其设置为具有两个值的两个维度更合乎逻辑。我有那栋楼,但这是我遇到麻烦的地方。

我需要四种变体中的每一种都有不同的包名。前三个很容易,因为我有一个默认值,每个维度都可以覆盖包,但我需要设置一个包名称,以便在两个非默认维度都在使用时。

flavorDimensions "foo", "bar"
productFlavors {
    boring.flavorDimension "foo"
    charm {
        flavorDimension "foo"
        packageName "com.example.charm"
    }
    strange {
        flavorDimension "bar"
        packageName "com.example.strange"
    }
    // This is the idea of what I want, but it doesn't work because there
    // must be only a single dimension specified here.
    charmStrange {
        flavorDimension "foo", "bar"
        packageName "com.example.charminglystrange"
    }
}

我尝试通过查找组合的风味变体来设置它,但我没有太多运气。我对Gradle不是很熟悉,所以我确信我没有雇用过诡计。或者,也许我可以在src/charmStrange/AndroidManifest.xml中指定包名称并让合并对其进行排序?这似乎可能在将来引发问题。

3 个答案:

答案 0 :(得分:3)

您现在可以为productFlavors设置applicationIdSuffix:

android {  
     productFlavors {  
          free {   
               applicationIdSuffix = ".free"  
          }  
          prod {

          } 
     }  
} 

来源: http://android-developers.blogspot.ie/2015/12/leveraging-product-flavors-in-android.html

答案 1 :(得分:2)

我有一个类似的问题,这个答案在我的情况下没有经过测试我将产品风味附加到由另一个维度设置的app id,使用你的示例将它附加.strange来打包com.example.charm

android.applicationVariants.all { variant ->
    def flavorString = variant.getVariantData().getVariantConfiguration().getFlavorName()
    def mergedFlavour = variant.getVariantData().getVariantConfiguration().getMergedFlavor();
    def appId = variant.getVariantData().getVariantConfiguration().getApplicationId();

    if(flavorString.contains("Strange")) {
        mergedFlavour.setApplicationId(appId + ".strange")
    }


}

但在您的情况下,您需要一个完整的包名称,如

android.applicationVariants.all { variant ->
    def flavorString = variant.getVariantData().getVariantConfiguration().getFlavorName()
    def mergedFlavour = variant.getVariantData().getVariantConfiguration().getMergedFlavor();
    def appId = variant.getVariantData().getVariantConfiguration().getApplicationId();

    if(flavorString.contains("charmStrange")) {
        mergedFlavour.setApplicationId("com.example.charminglystrange)
    }


}

charmStrange可能需要是CharmStrange,尝试使用它

答案 2 :(得分:0)

您需要设置applicationId,而不是packageName:

    productFlavors {
        boring.flavorDimension "foo"
        charm {
            flavorDimension "foo"
            applicationId "com.example.charm"
        }
        strange {
            flavorDimension "bar"
            applicationId "com.example.strange"
        }
        // This is the idea of what I want, but it doesn't work because there
        // must be only a single dimension specified here.
        charmStrange {
            flavorDimension "foo", "bar"
            packageName "com.example.charminglystrange"
        }
    }