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

标签 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"
   }

}

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

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

可以看到包被替换成功了。

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

这里有人遇到同样的问题吗?如何解决这个问题?这是一个 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
}

关于java - 使用 flavor 维度时设置 Android applicationId 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33893955/

相关文章:

android - Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT 不工作 4.4.4

java - Android Gradle如何与调试库链接

java - 如何在java中解析build.gradle文件?

Java 正则表达式 特殊字符和 & 符号

android - 在 2 个功能模块中导入同一个库时 list 合并失败

android - 如何在 ListView 中显示位图?

android - buildToolsVersion 范围或 gradle 中的 '+'

java - 如何使用 Java 8 流将列表元素映射到它们的索引?

java - 将 '==' 与字符串一起使用? ( java )

java - 从 Java 中的 Cypher 查询检索结果缓慢 - Neo4j 2.0