使用flavor尺寸时设置Android applicationId的正确方法是什么?

时间:2015-11-24 12:39:17

标签: java android gradle android-gradle

我在项目中使用了flavor维度,并且我一直在使用for循环将applicationId设置为我生成的flavor:

flavorDimensions "appname", "brand"

productFlavors {

   user {
        dimension "appname"
   }

   installer {
        dimension "appname"
   }

   branda {
        dimension "brand"
   }

   brandb {
        dimension "brand"
   }

   brandc {
        dimension "brand"
   }

   brandd {
        dimension "brand"
   }

}

我过滤那些我现在不支持的内容:

variantFilter { variant ->
  def names = variant.flavors*.name

  if (names.contains("installer") && (names.contains("brandc") || names.contains("brancd")) ) {
      variant.ignore = true
  }
}

然后我根据风味名称更新applicationId:

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

switch (flavorString) {
/**
 * user
 */
case "userBranda":
  mergedFlavour.setApplicationId("com.mycompany.product.user.someName")
  mergedFlavour.setVersionName("1.0.0")
  break
case "userBrandb":
  mergedFlavour.setApplicationId("com.mycompany.product.user.b")
  mergedFlavour.setVersionName("2.0.0")
break
case "userBrandc":
  mergedFlavour.setApplicationId("com.mycompany.product.user.otherName")
  mergedFlavour.setVersionName("1.5.0")
  break
case "userBrandd":
  mergedFlavour.setApplicationId("com.mycompany.product.user.d")
  mergedFlavour.setVersionName("1.0.1")
  break
/**
 * installer
 */
case "installerBranda":
  mergedFlavour.setApplicationId("com.mycompany.product.installer.marketingName")
  mergedFlavour.setVersionName("1.0.0")
  break
case "installerBrandb":
  mergedFlavour.setApplicationId("com.mycompany.product.installer.b")
  mergedFlavour.setVersionName("1.0.0")
  break
default:
  throw new GradleException("flavor ${flavorString} is not supported, please configure it first...")
  break
}

我有两个问题:

1 - 这是正确的方法吗? android插件不支持使用flavorDimensions配置applicationId的方法吗?

2 - 我在此处提到的配置适用于大多数情况,例如,如果您使用的google-services.json已经在内部定义了应用程序包。对于简单的productFlavor用法,配置正常,但如果我使用flavor维度,gradle总是抱怨:

:app:processUserBrandaDebugGoogleServices
No matching client found for package name 'com.mycompany.product'

基本上' com.mycompany.product'是默认情况下在AndroidManifest.xml中定义的包。 如果我查看

app/build/intermediates/manifests/full/userBranda/debug/AndroidManifest.xml

我可以看到包装已被取代成功。

我可以得出的结论是,仅针对风味维度,以某种方式gradle仅在processUserBrandaDebugGoogleServices之后合并清单,这意味着此时清单中定义的包仍然是默认包。

这里有同样问题的人吗?如何解决这个问题?这是一个android gradle插件bug吗?

1 个答案:

答案 0 :(得分:5)

简而言之,关键字为applicationIdSuffix,如下所示:

productFlavors {
    pro {
        applicationIdSuffix = ".pro"
    }
    free {
        applicationIdSuffix = ".free"
    }
}

buildTypes {
    debug {
        applicationIdSuffix ".debug"
    }
}

更强大,你可以这样做:

applicationVariants.all { variant ->
    def flavorData = rootProject.ext[variant.buildType.name]

    variant.mergedFlavor.setApplicationId(flavorData.applicationId)
    //do other things
}
相关问题