有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java当使用flavor维度时,设置Android applicationId的正确方法是什么?

我在项目中使用了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这是正确的方法吗?安卓插件不支持使用flavorDimensions配置applicationId的方法

2-我在这里提到的配置在大多数情况下都有效,除非你使用的是谷歌服务。其中已经定义了应用程序包的json。对于简单的productFlavor使用,配置正常,但如果我使用flavor维度,gradle总是抱怨:

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

基本上是“com”。我的公司。product’是AndroidManifest中默认定义的包。xml。 如果我看看

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

我可以看出,这个方案已被成功取代

我可以得出的结论是,只有在味道维度上,gradle才会在ProcessUserBrandedeBugGoogleServices之后合并清单,这意味着此时,清单中定义的包仍然是默认包

有人有同样的问题吗?如何解决这个问题?这是安卓gradle插件漏洞吗


共 (2) 个答案

  1. # 1 楼答案

    简而言之,关键字是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
    }
    
  2. # 2 楼答案

    我也在努力解决这个问题。有效的解决方案是在android{}groovy代码块之后写入apply plugin: 'com.google.gms.google-services',以确保在执行插件代码时,已经设置了正确的applicationId