包名不匹配 (Google Analytics) - 多个 productFlavors 和 buildTypes 中找不到相应的客户端

642
背景信息:我正在尝试为我的应用程序设置Google Analytics(拥有4个自定义`buildTypes`和多个`productFlavors`)。
当我选择`Build Variant`时,将`applicationId`设置为`com.my.app.package.name`(生成`google-services.json`时使用的包名),它可以正常工作。但是,我的其他flavor具有不同的applicationIds。
我遵循官方开发指南进行设置。如下是当选择任何其他构建变体时(具有不同的applicationId(包名称))在“Build Variants”选项卡中获得的错误:
错误::app:processAllcategoriesDebugfreeGoogleServices的执行失败。 无法找到与包名称'com.my.app.package.name.debug'匹配的客户端。
该错误指出`Debugfree`是自定义的`buildType`,而`Allcategories`是其中一个`productFlavors`。
问题: 现在,`google-services.json`位于`app`文件夹中,因此我不能通过将其放入特定于flavor的源集文件夹中来将它们分离出来。
问题: 1. 我的调试自定义`byildType`会将`.debug`后缀添加到`applicationId`(包名)。是否有一种方法可以使它与具有我的发布`applicationId`(即没有后缀`.debug`)的`google-services.json`文件一起使用? 2. 是否有一种方法将多个产品风味配置在同一个`google-services.json`文件中,而不使用单独的文件和任务来复制所需的文件到`app`文件夹中?我知道可以使用任务来完成这一点,如此帖子中所述。是否有更简单的方法只使用一个文件或根据Gradle配置选择正确的文件? 3. 我看到`google-services.json`中的`package_name`字段具有包名`com.my.app.package.name`。我是否可以手动添加多个包名以适用于所有构建变体?如果可以,如何操作?文档中没有找到任何说明。

1
你有没有找到特别针对你第三个问题的解决方案? - Mate
我也遇到了类似的情况。我只需要针对其中一个产品发布版本进行分析支持。我已经成功地限制了添加依赖项到产品版本,但它仍然在son文件的一部分中搜索正确的软件包。有什么建议吗? - CoDe
1
我也遇到了同样的问题,请知道有人找到解决方法吗? - Deepanshu Sinha
在我的情况下,我只是更改了包名。 - larsaars
如果您在应用程序中使用Firebase,则将新的applicationId作为子应用程序(添加应用程序)添加,问题将得到解决。 - Mohd Qasim
35个回答

687

检查您的 google-services.json 文件中的包名,它应该与您的应用程序本地包名相同。

示例

"client_info": {
    "mobilesdk_app_id": "1:6596814400689:android:65d6f25f5006145",
    "android_client_info": {
      "package_name": "com.my.app.package.name"
    }
在这种情况下,我的本地软件包名称是 com.my.app.package.name,所以我也已经在 google-services.json 中将我的软件包名称更改为本地软件包名称。

google-services.json是一个文件!!!位于应用程序目录中。可以通过Windows资源管理器(例如)找到此文件。应使用通常的编辑器编辑此文件。 - user_MGU
要找到此内容,请在Android Studio的“项目视图”中搜索您的应用程序包。 - Gastón Saillén
60
不... 我们都知道 google-services.json 在这个问题中是无效的...我们想要的是如何在构建变体情况下解决此问题!! - MJ Studio
1
如果你的活动位于一个子包中,例如:com.example.aaron.myproject22.Activities ...,那么你需要进入 google-services.json 并将 client_info 的 package_name 更改为 com.example.aaron.myproject22。同时确保在 build.grade(模块应用程序)底部应用插件 com.google.gms.google-services - WHOATEMYNOODLES
这对我有帮助。我正在使用Firebase推送通知库,Firebase控制台生成的google-services.json文件使用了应用程序包名称而不是库的包名称。谢谢! - ScottyB

315
发现了这个:

The google-services.json file is generally placed in the app/ directory, but as of version 2.0.0-alpha3 of the plugin support was added for build types, which would make the following directory structure valid:

app/src/
    main/google-services.json
    dogfood/google-services.json
    mytype1/google-services.json
    ...

来源

来源2


35
有没有一种简单的方法可以禁用构建类型的分析?我想要在Debug中禁用它。我以为如果我不添加google-services文件,它就会被禁用,但是即使我禁用了,它仍然会要求google-services文件。 - Gokhan Arik
2
每个口味中添加的每个JSON文件有什么区别? - Android
2
有没有可能在一个模块内使用谷歌服务(两个应用程序共享)...因为我甚至不能 gradle-sync,除非该包含谷歌服务文件...嵌入式应用程序应该提供 json,但不是模块。这是否有可能? - Georg
1
当我把 google-service.json 文件移动到名为 staging 的新文件夹时,我遇到了这个错误: File google-services.json is missing. The Google Services Plugin cannot function without it. 。我只需要在暂存环境中使用 Firebase,但这并没有解决问题 :( - shurrok

176

找不到与包名 'com.tf' 匹配的客户端

我非常确定 google-services.json 中的“package_name”与您的应用程序 gradle 中的“applicationId”不匹配。

app gradle:

defaultConfig {
        applicationId "com.tf" //replace with the package_name in google-services.json =
        minSdkVersion 23
        targetSdkVersion 26
        versionCode 7
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

google-services.json

"client_info": {
        "mobilesdk_app_id": "1:23978655351:android:2b2fece6b961cc70",
        "android_client_info": {
          "package_name": "in.ac.geu.debug"
        }
      },

解决方案: 确保package_nameapplicationId必须相同。


15
作者在询问如何解决这个问题。他们有不同的构建类型,每个类型都有不同的applicationId。 - Dmitry Guselnikov
2
你提供了最有效的解决方案。真棒! - Devansh sadhotra
3
在应用级别的Gradle文件中,application id设置得很妥当。 - BlackPearl
2
这是正确的答案。只需确保package_name = applicationId。在我的情况下,我创建了一个新项目并给它起了一个新名称(A),然后从旧项目(B)中复制了旧代码。在项目B中,package_name是我在firebase控制台上选择的名称,但这并不重要,我们不需要匹配SDK安装指令中设置的名称。 - Phil Nguyen

91

13
这是最佳答案,因为所有产品口味都可以由一个JSON文件涵盖。不需要创建其他来源集。 - Tash Pemhiwa
2
请注意,您必须在同一项目中创建应用程序。左上角的项目概述有一个设置图标。点击它,它将打开到“常规”选项卡,在“您的应用程序”部分下滚动,有一个“添加应用程序”的按钮。 - galaxigirl
1
当你忘记更改你的google-service.json并将其推送到生产环境时,最大的问题会发生。 - Edhar Khimich

82

每当您创建或更新包名称时,请确保您的包名称完全相同[区分大小写]

请执行以下步骤。

1). 检查应用级别的gradle文件中的applicationId

2). 检查google-services.json文件中的package_name

3). 检查AndroidManifest文件中的package,

并且为了完全确认,确保您的工作包目录名称即("com.example.app")也完全相同。

编辑[任何遇到在productFlavour场景中出现此问题的人,请查看Droid Chris的解决方案]


3
谢谢兄弟,这对我有用。在应用级别的Gradle文件中,我的包名不同。当我改变它时,它对我有用。 - fazil
欢迎 @fazil - Ravi Vaniya
您无需在清单中更改“package”(以及所有包中的所有文件),因为“applicationId”将更改应用程序ID。 - CoolMind
这不是作者所询问的内容。 - shurrok

78
请在 "google-services.json" 文件中确保您的包名与您应用程序的包名相同。

5
在为新项目派生存储库时常见问题。 - Zapnologica
1
如果两个软件包名称不同,则返回“是”,表示它无法工作。 - Priya

64

首先,在Gradle中将应用程序包添加后缀:

yourFlavor {
   applicationIdSuffix "yourFlavor"
}

这会导致你的软件包被命名为

com.domain.yourapp.yourFlavor

接下来,请前往您当前项目下的 Firebase 并添加另一个具有此包名的 Android 应用程序。

然后,使用新应用程序生成的新文件替换现有的 google-services.json 文件。

这样,您最终将得到一个拥有多个 "client_info" 部分的内容。因此,您最终应该得到类似于这样的内容:

"client_info": {
    "mobilesdk_app_id": "YOUR APP INFO",
    "android_client_info": {
      "package_name": "com.domain.yourapp"
    }
  }

"client_info": {
    "mobilesdk_app_id": "YOUR APP INFO - will be different then other app info",
    "android_client_info": {
      "package_name": "com.domain.yourapp.yourFlavor"
    }
  }

3
这是正确的答案!在 google-services.json 文件中,您需要同时添加两个应用程序(即 id)。 - Bojan Hrnkas
2
简单明了。 - Umair
6
关于构建变体,这应该被标记为正确答案。 - Zamrony P. Juhara
1
尽管我已经在这里回答了这个问题[https://dev59.com/d1sW5IYBdhLWcg3wbWxv#50906585],但对于`productFlavour`的情况,这是最好的解决方案,我一定会在我的答案中链接你的答案以帮助未来的开发人员,谢谢 +1。 - Ravi Vaniya
1
正确的答案!! 工作正常,谢谢 - Annie
显示剩余3条评论

59

当您在项目中下载了一个Google服务Json文件,其包名称与您的项目包名称不匹配时,就会出现此错误。

最近更改了项目的包名称吗?

这会更新所有的类,但不会更新Gradle文件。因此,请检查您的Gradle文件和Manifest文件中的包名称是否正确。


46

您需要将 google-services.json 文件放置在 app/ 目录下。对于每个构建类型,在 app/src 文件夹中都应该有相对应的目录。

例如,如果您有发布版和调试版:

app/google-services.json
app/src/debug/google-services.json

在所有的 google-services.json 文件中,您应该根据构建类型指定正确的 package_name

例如,在 debug 目录中,它应该像这样:{com.myapp}.debug


8
显然,您甚至可以只是复制主集合中的元素到“客户端”数组中(在元素之间添加逗号),并仅更改新元素的“package_name”值以包含“.debug”后缀。然后重新构建即可。在AS 2.3.3上对我有效。 - et_l

32

1. 验证软件包名称应用程序ID应该相同。

2. 验证位于应用程序文件夹中的google-services.json软件包名称


我还需要执行 Invalidate Caches / Restart... 才能使其正常工作。 - Anthony Cannon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接