// To auto-generate google map api key of google-services.json
implementation 'com.google.android.gms:play-services-maps:17.0.0'
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_api_key" />
app/src/
flavor1/google-services.json
flavor2/google-services.json
插件的3.0.0版本在以下位置搜索JSON文件(假设你有一个flavor
flavor1和一个构建类型debug
):
/app/src/debug/google-services.json
/app/src/debug/flavor1/google-services.json
/app/google-services.json
`/app/src/flavor1/google-services.json
/app/src/debug/google-services.json
/app/src/flavor1Debug/google-services.json
/app/src/flavor1/debug/google-services.json
/app/src/debug/flavor1/google-services.json
/app/google-services.json`
PS:gradle版本需为3.5或更高。 - fatih ergin更新:以下说明适用于一个Android Studio项目,其中有一个Firebase项目和不同的Firebase应用程序。
如果目标是在同一个Android Studio项目中的不同Firebase项目的不同Firebase应用程序中拥有不同的JSON文件(或者您不知道有什么区别),请看这里。
您需要为每个Android应用程序ID(通常是包名称)创建一个Firebase应用程序。每个Gradle构建变体通常都有一个应用程序ID(如果使用Gradle构建类型和Gradle构建风味,则很可能会出现这种情况)
自从Google服务3.0和使用Firebase后,无需为不同的风味创建不同的文件。 对于具有相互组合的productFlavours和Build类型的情况,为不同的风味创建不同的文件可能并不清晰或直截了当。
在同一个文件中,您将拥有所有构建类型和风味所需的所有配置。
在Firebase控制台中,您需要为每个包名称添加一个应用程序。假设您有2种风味(dev和live)和2种构建类型(debug和release)。根据您的配置,但很可能您有4个不同的包名称,如:
您需要在Firebase控制台中创建4个不同的Android应用程序。(在每个应用程序中,您需要为每台计算机的调试和实时版本添加SHA-1)
当您下载google-services.json文件时,实际上并不重要从哪个应用程序下载它,它们所有应用程序都包含与所有应用程序相关的相同信息。
现在,您需要在应用程序级别(app /)中找到此文件。
如果您打开该文件,则会发现该文件包含所有包名称的信息。
插件是一个痛点。为了使其工作,您需要将插件定位在文件底部。所以这行..
apply plugin: 'com.google.gms.google-services'
......需要在您的应用程序 build.gradle 文件的底部。
对于这里大多数的内容,之前的版本也适用。我以前从未为不同的配置使用不同的文件,但现在使用 Firebase 控制台更容易了,因为它们提供一个单一的文件,包含您所有配置所需的一切。
我写了一篇Medium文章来讨论这个问题。
我曾经遇到过一个类似的问题(使用BuildTypes而不是Flavors),并通过以下方式解决:
利用Gradle的依赖管理系统。我创建了两个任务,switchToDebug
和 switchToRelease
。要求每次运行 assembleRelease
时都运行 switchToRelease
,调试也是同理。
def appModuleRootFolder = '.'
def srcDir = 'src'
def googleServicesJson = 'google-services.json'
task switchToDebug(type: Copy) {
def buildType = 'debug'
description = 'Switches to DEBUG google-services.json'
from "${srcDir}/${buildType}"
include "$googleServicesJson"
into "$appModuleRootFolder"
}
task switchToRelease(type: Copy) {
def buildType = 'release'
description = 'Switches to RELEASE google-services.json'
from "${srcDir}/${buildType}/"
include "$googleServicesJson"
into "$appModuleRootFolder"
}
afterEvaluate {
processDebugGoogleServices.dependsOn switchToDebug
processReleaseGoogleServices.dependsOn switchToRelease
}
编辑:使用processDebugFlavorGoogleServices
/processReleaseFlavorGoogleServices
任务在每个变体级别上修改它。
根据ahmed_khan_89的回答, 你可以将"复制代码"放在产品口味内。
productFlavors {
staging {
applicationId = "com.demo.staging"
println "Using Staging google-service.json"
copy {
from 'src/staging/'
include '*.json'
into '.'
}
}
production {
applicationId = "com.demo.production"
println "Using Production google-service.json"
copy {
from 'src/production/'
include '*.json'
into '.'
}
}
}
那么您就不需要手动切换设置了。
我遇到了同样的问题,但找不到完美的解决方法。这只是一个临时办法。 我在想谷歌为什么没有考虑过flavor呢?希望他们能尽快提出更好的解决方案。
我的做法:
我有两个flavor,在每个flavor中放入相应的google-services.json:src/flavor1/google-services.json
和 src/flavor2/google-services.json
。
然后在build.gradle中,根据flavor复制文件到app/
目录下:
android {
// set build flavor here to get the right gcm configuration.
//def myFlavor = "flavor1"
def myFlavor = "flavor2"
if (myFlavor.equals("flavor1")) {
println "--> flavor1 copy!"
copy {
from 'src/flavor1/'
include '*.json'
into '.'
}
} else {
println "--> flavor2 copy!"
copy {
from 'src/flavor2/'
include '*.json'
into '.'
}
}
// other stuff
}
限制:每次想要运行不同的风味时(因为它是硬编码),您将不得不在gradle中手动更改myFlavor
。
我尝试了许多方法来获取当前的构建风味,例如afterEvaluate
等... 但直到现在我仍找不到更好的解决方案。
更新,另一种解决方案:所有风味使用一个google-services.json文件:
您还可以为每个风味设置不同的包名称,然后在Google开发人员控制台中,您不必为每个风味创建两个不同的应用程序,而只需在同一应用程序中创建两个不同的客户端。
然后,您将只有一个包含两个客户端的google-services.json
文件。
当然,这取决于您如何实现您的风味的后端。如果它们没有分开,则此解决方案将无法帮助您。
google-services.json
文件来同时支持 release
和 debug
对我而言是可行的,就像你在更新中提到的那样。如果你只是想要分离你的 debug
构建,我认为这是最简单的解决方案。参考文献:你可以在这里生成该文件:https://developers.google.com/mobile/add?platform=android - yuval{
"project_info": {
"project_id": "PRODJECT-ID",
"project_number": "PROJECT-NUMBER",
"name": "APPLICATION-NAME"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:PROJECT-NUMBER:android:HASH-FOR-FLAVOR1",
"client_id": "android:PACKAGE-NAME-1",
"client_type": 1,
"android_client_info": {
"package_name": "PACKAGE-NAME-1"
}
},
"oauth_client": [],
"api_key": [],
"services": {
"analytics_service": {
"status": 1
},
"cloud_messaging_service": {
"status": 2,
"apns_config": []
},
"appinvite_service": {
"status": 1,
"other_platform_oauth_client": []
},
"google_signin_service": {
"status": 1
},
"ads_service": {
"status": 1
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:PROJECT-NUMBER:android:HASH-FOR-FLAVOR2",
"client_id": "android:PACKAGE-NAME-2",
"client_type": 1,
"android_client_info": {
"package_name": "PACKAGE-NAME-2"
}
},
"oauth_client": [],
"api_key": [],
"services": {
"analytics_service": {
"status": 1
},
"cloud_messaging_service": {
"status": 2,
"apns_config": []
},
"appinvite_service": {
"status": 1,
"other_platform_oauth_client": []
},
"google_signin_service": {
"status": 1
},
"ads_service": {
"status": 1
}
}
}
],
"client_info": [],
"ARTIFACT_VERSION": "1"
}
在我的项目中,我正在使用相同的项目ID,当我在上述网址中添加第二个包名时,谷歌会向我提供一个包含多个客户端的JSON数据文件。
1.) google-services.json究竟是什么?
请参考此链接:https://dev59.com/SVwZ5IYBdhLWcg3wVO5U#31598587
2.) google-services.json文件如何影响你的Android Studio项目?
请参考此链接:https://dev59.com/SVwZ5IYBdhLWcg3wVO5U#33083898
简单来说,如果你将google-services.json添加到你的项目中,就会在以下路径下自动生成一个名为google-services
的文件夹,用于debug
模式的变体。
app/build/generated/res/google-services/debug/values/values.xml
3.) 如何完成?
在project_level
build.gradle文件中加入google-services依赖项,如果你正在使用app_compat库,也可以使用版本3.0.0
。
// Top-level build.gradle file
classpath 'com.google.gms:google-services:2.1.2'
现在在app_level
的build.gradle文件中,您需要将以下内容添加到底部。
// app-level build.gradle file
apply plugin: 'com.google.gms.google-services'
注意: 在gradle文件的底部添加此行非常重要。否则,Gradle构建不会给出任何错误,但它将无法正常工作。
4.) Google-service.json文件应该放在哪里?
情况1:如果没有build_flavor,只需将其放置在/app/google-service.json
文件夹中。
情况2:如果有多个build_flavor,并且您有不同的google_services.json文件,请将其放在app/src/build_flavor/google-service.json
中。
情况3:如果有多个build_flavor,并且您只有一个google_services.json文件,请将其放在app/google-service.json
中。
google-services.json文件不必要用于接收通知。只需在build.gradle文件中为每个flavour添加一个变量即可:
buildConfigField "String", "GCM_SENDER_ID", "\"111111111111\""
在注册时,请使用变量BuildConfig.GCM_SENDER_ID,而不是getString(R.string.gcm_defaultSenderId):
instanceID.getToken(BuildConfig.GCM_SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
google-services.json
from your project.google-services.json
..mine looked like this
File google-services.json is missing. The Google Services Plugin cannot function without it.
Searched Location:
C:\Users\username\Desktop\HelloWorld\app\src\devSuffixYes_EnvQaApistaging_\google-services.json
C:\Users\username\Desktop\HelloWorld\app\src\debug\google-services.json
C:\Users\username\Desktop\HelloWorld\app\src\devSuffixYes_EnvQaApistaging_Debug\google-services.json
C:\Users\username\Desktop\HelloWorld\app\src\dev\google-services.json
C:\Users\username\Desktop\HelloWorld\app\src\devDebug\google-services.json
C:\Users\username\Desktop\HelloWorld\app\src\devSuffixYes_EnvQaApistaging_\debug\google-services.json
C:\Users\username\Desktop\HelloWorld\app\src\debug\devSuffixYes_EnvQaApistaging_\google-services.json
C:\Users\username\Desktop\HelloWorld\app\src\dev\debug\google-services.json
C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\google-services.json
C:\Users\username\Desktop\HelloWorld\app\src\dev\suffixDebug\google-services.json
C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\debug\google-services.json
C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\google-services.json
C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_Debug\google-services.json
C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\debug\google-services.json
C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\google-services.json
C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\envDebug\google-services.json
C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\debug\google-services.json
C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\qa\google-services.json
C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\qaDebug\google-services.json
C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\qa\debug\google-services.json
C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\qa\apistaging_\google-services.json
C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\qa\apistaging_Debug\google-services.json
C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\qa\apistaging_\debug\google-services.json
C:\Users\username\Desktop\HelloWorld\app\google-services.json
注意: 它还关心flavorDimensions
中声明的顺序。我的是 flavorDimensions "dev_suffix", "environment"
apply plugin: 'com.google.gms.google-services'
行似乎会将gcm
字符串放入app/build/generated/res/google-services/debug/values/values.xml
。 - Alexander Farber