GoogleServices - 如何使用flavorDimensions 为每种风味组合设置不同的applicationId?
Posted
技术标签:
【中文标题】GoogleServices - 如何使用flavorDimensions 为每种风味组合设置不同的applicationId?【英文标题】:GoogleServices - How to set different applicationId for each flavor combination using flavorDimensions? 【发布时间】:2020-07-29 12:51:26 【问题描述】:我的旧应用程序使用了不合规的 applicationId。我尝试使用 flavorDimensions 迁移它们以共享如此常见的资产和代码。 我有这个口味设置:
defaultConfig
applicationId "com.example"
flavorDimensions 'fruit', 'env'
productFlavors
pear
dimension 'fruit'
banana
dimension 'fruit'
staging
dimension 'env'
prod
dimension 'env'
我想通过风味组合来获得这些 applicationId:
pearStaging:com.example.pear_staging
(注意“_”)
pearProd : com.example.pear
bananaStaging:com.example.banana_staging
(注意“_”)
bananaProd : com.example.banana
我尝试过使用applicationIdSuffix
:
productFlavors
pear
dimension 'fruit'
applicationIdSuffix 'pear'
banana
dimension 'fruit'
applicationIdSuffix 'banana'
staging
dimension 'env'
applicationIdSuffix '_staging'
prod
dimension 'env'
但后缀默认用点分隔。所以它生成了错误的applicationId,例如:
风味pearStaging:com.example.pear._staging
(注意“_”前的“.”)
我在这个帖子上看到了答案:
How to set different applicationId for each flavor combination using flavorDimensions?
他们讨论了使用mergedFlavor.setApplicationId(...)
在最后覆盖 applicationId 的解决方法。但如果我与 google services gradle plugin 结合使用,这将不起作用。
因为在插件过程阶段,我收到了这个错误:
* What went wrong:
Execution failed for task ':app:processPearStagingDebugGoogleServices'.
> No matching client found for package name 'com.example'
如您所见,它使用默认的 applicationId/package 名称,而不是在 android.applicationVariants.all
阶段覆盖的 appId。
所以有更好的方法来定义我的 applicationId 每个风味组合与谷歌服务任务一起使用? (我需要用“_”保留这些applicationId,不能更改)。
【问题讨论】:
不幸的是,无法自动执行此操作。正如您在docs 中看到的那样,唯一的选择是带点的后缀 我找到了一个解决方案,但没有 flavorDimension 组合...(并且没有后缀) 【参考方案1】:目前 google services gradle 插件的工作方式是不可能的。也许有一种方法可以反馈给谷歌,但同时,使用“_”实现应用程序 ID 的唯一方法是在构建 apk 后重命名应用程序 ID。因此,特定风味的应用程序 ID 将使用“.”构建。先使用分隔符,然后在构建 apk 后重命名应用程序 ID。
这可以通过使用apktool打开apk的标准程序来完成,将应用程序ID更改为你需要的,然后用apktool重新打包,zipalign,重新签名等。如果可能太繁琐,有尝试这样做的 GitHub 项目,但它们可能不适用于所有 apk。
例如:
-
https://github.com/testwhat/PackageRenamer
https://github.com/sjitech/ApkRename
【讨论】:
那假设声明 google-services.json 里面有一个点来通过编译?这应该会导致 Google 服务中的 applicationId 匹配出现问题。 我的意思是,类似applicationIdSuffix '.staging'
而不是applicationIdSuffix '_staging'
。对于 google-services.json,您可以为每种风味组合使用不同的 google-services.json。
正如我在问题中所说:“我需要用“_”保留这些 applicationId,不能更改它”,因为这些 appId 用于后端服务器和合作伙伴。改变它需要很多人的行动,我不寻找。我知道使用 dot all 会更简单。以上是关于GoogleServices - 如何使用flavorDimensions 为每种风味组合设置不同的applicationId?的主要内容,如果未能解决你的问题,请参考以下文章
为了解决“google-services.json 丢失”问题,我应该在 Flutter 应用程序中的啥位置放置 Googleservices.json
GoogleServices API 级别更改早于 Nougat(API 级别 24)