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:

pearStagingcom.example.pear_staging(注意“_”) pearProd : com.example.pear bananaStagingcom.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,例如:

风味pearStagingcom.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)

如何访问复合材料中的 jsf 复合材料的标记名?

如何生成有效的 APNS 证书 (.p12) 以在 GCM for iOS 中使用?

Google Play 游戏服务退出回调

如何优化 Android Studio 启动,编译和运行速度