繁体   English   中英

使用风味维度时设置 Android applicationId 的正确方法是什么?

[英]What is the correct way to set Android applicationId when using flavor dimensions?

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

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 使用,配置工作正常,但是如果我使用风味维度,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插件错误吗?

简而言之,关键字是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
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM