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

Nun*_* D. 8 java android gradle android-gradle-plugin

我在我的项目中使用了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"
   }

}
Run Code Online (Sandbox Code Playgroud)

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

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

  if (names.contains("installer") && (names.contains("brandc") || names.contains("brancd")) ) {
      variant.ignore = true
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我根据flavor名称更新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
}
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

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

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

:app:processUserBrandaDebugGoogleServices
No matching client found for package name 'com.mycompany.product'
Run Code Online (Sandbox Code Playgroud)

基本上'com.mycompany.product'是AndroidManifest.xml中默认定义的包.如果我看着

app/build/intermediates/manifests/full/userBranda/debug/AndroidManifest.xml
Run Code Online (Sandbox Code Playgroud)

我可以看到包装被成功取代了.

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

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

lao*_*omo 5

简而言之,关键字是applicationIdSuffix这样的:

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

buildTypes {
    debug {
        applicationIdSuffix ".debug"
    }
}
Run Code Online (Sandbox Code Playgroud)

更强大,你可以这样做:

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

    variant.mergedFlavor.setApplicationId(flavorData.applicationId)
    //do other things
}
Run Code Online (Sandbox Code Playgroud)