gen*_*tra 430 android google-cloud-messaging google-play-services
我实施新的谷歌云消息之后从谷歌开发者页面的导游在这里
我已成功运行并测试它.但我现在的问题是我有不同的productFlavors具有不同的applicationId/packageName和不同的GCM项目ID.在google-services.json具有在被投入/app/google-services.json不是味道文件夹.
有没有办法让google-services.json配置与许多口味不同?
Yai*_*lka 478
谷歌在播放服务插件2.0版本中包含了对风味的支持.从这个版本开始gradle plugin com.google.gms:google-services:2.0.0-alpha3
你可以这样做
app/src/
flavor1/google-services.json
flavor2/google-services.json
Run Code Online (Sandbox Code Playgroud)
插件3.0.0版在这些位置搜索json文件(考虑到你有一个flavorflavor1和一个构建类型debug):
/app/src/debug/google-services.json
/app/src/debug/flavor1/google-services.json
/app/google-services.json
Run Code Online (Sandbox Code Playgroud)
即使使用flavorDimensions,这对我也有用.我在一个方面有免费和付费,在另一个方面有Mock&Prod.我还有3个buildTypes:debug,release和staging.这就是我在FreeProd风格的项目中的样子:
google-services.json文件的数量取决于项目的特征,但每个Google项目至少需要一个json文件.
如果你想了解这个插件对这些json文件做什么的更多细节,请点击:https: //github.com/googlesamples/google-services/issues/54#issuecomment-165824720
链接到官方文档:https: //developers.google.com/android/guides/google-services-plugin
包含最新信息的博客帖子:https://firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html
并转到此处查看此插件的最新版本:https://bintray.com/android/android-tools/com.google.gms.google-services/view
Sot*_*tti 63
更新:以下说明适用于一个Android Studio项目,该项目中包含一个Firebase项目和不同的Firebase应用程序.如果目标是在同一个Android Studio项目中为不同的Firebase项目中的不同Firebase应用程序提供不同的JSON文件,(或者如果您不知道有什么区别)请查看此处..
每个Android应用程序ID(通常是程序包名称)需要一个Firebase应用程序.每个Gradle构建变体有一个应用程序ID是常见的(如果您使用Gradle构建类型和Gradle构建样式,这将很可能)
从Google Services 3.0开始,使用Firebase时,没有必要为不同的风格创建不同的文件.如果您拥有相互组合的productFlavours和Build类型,那么为不同的风格创建不同的文件可能不明确或不直接.
在同一个文件中,您将拥有所有构建类型和风格所需的所有配置.
在Firebase控制台中,您需要为每个程序包名称添加一个应用程序.想象一下,你有2种风格(开发和实时)和2种构建类型(调试和发布).根据您的配置,但您可能有4个不同的包名称,如:
您需要在Firebase控制台中使用4种不同的Android应用.(在每一个上你需要为你正在使用的每台计算机添加SHA-1进行调试和实时)
当您下载google-services.json文件时,实际上它与您下载的应用程序无关,它们都包含与您的所有应用相关的相同信息.
现在,您需要在应用程序级别(app /)中找到此文件.
如果您打开该文件,您将看到如果包含所有包名称的所有信息.
痛点用作插件.为了使其正常工作,您需要在文件底部找到插件.所以这一行..
apply plugin: 'com.google.gms.google-services'
Run Code Online (Sandbox Code Playgroud)
...需要位于app build.gradle文件的底部.
对于这里所述的大部分内容,它也适用于以前的版本.我从来没有为不同的配置提供不同的文件,但现在使用Firebase控制台更容易,因为它们提供了一个单独的文件,包含了所有配置所需的一切.
Zak*_*rdi 41
在这个问题上写了一篇中文帖子.
有一个类似的问题(使用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
}
Run Code Online (Sandbox Code Playgroud)
编辑:使用processDebugFlavorGoogleServices/ processReleaseFlavorGoogleServices任务以每个风味级别修改它.
ahm*_*_89 13
好吧,我遇到了同样的问题,无法得到任何完美的解决方案.这只是一种解决方法.我想知道谷歌如何不考虑口味......?我希望他们能尽快提出更好的解决方案.
我在做什么:
我有两种口味,每一种我都把相应的google-services.json:src/flavor1/google-services.json和src/flavor2/google-services.json.
然后在构建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
}
Run Code Online (Sandbox Code Playgroud)
限制:每次要运行不同的风格时,您都必须myFlavor 手动更改gradle(因为它是硬编码的).
我尝试了很多方法来获得当前的构建风格,如afterEvaluate关闭......直到现在才能得到更好的解决方案.
更新,另一个解决方案:一个google-services.json用于所有风格:
您还可以为每种风格设置不同的软件包名称,然后在google开发人员控制台中,您不必为每种风格创建两个不同的应用程序,而只需在同一个应用程序中创建两个不同的客户端.然后你将只有一个google-services.json包含你的两个客户.当然,这取决于你如何实现你的口味的后端.如果他们没有分开,那么这个解决方案对你没有帮助.
小智 12
根据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 '.'
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后您不必手动切换设置.
google-services.json文件不需要接收通知.只需为build.gradle文件中的每个flavor添加一个变量:
buildConfigField "String", "GCM_SENDER_ID", "\"111111111111\""
Run Code Online (Sandbox Code Playgroud)
注册时使用此变量BuildConfig.GCM_SENDER_ID而不是getString(R.string.gcm_defaultSenderId):
instanceID.getToken(BuildConfig.GCM_SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
Run Code Online (Sandbox Code Playgroud)
我正在使用从这里创建的google-services.json文件:https://developers.google.com/mobile/add?platform = android&cntapi = gcm&cnturl = https:%2F% 2Fdevelopers.google.com%2Fcloud- messaging %2Fandroid%2Fclient&cntlbl =继续%20Adding%20GCM%20Support&%3Fconfigured%3Dtrue
在JSON结构中有一个名为clients的JSON数组.如果您有多种口味,只需在此处添加不同的属性即可.
{
"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"
}
Run Code Online (Sandbox Code Playgroud)
在我的项目中,我使用相同的project-id,当我在上面的url中添加第二个包名时,谷歌为我提供了一个包含json-data中多个客户端的文件.
对不起,紧凑的JSON数据.我无法正确格式化...
google-services.json从您的项目中删除现有的。google-services.json..mine 放在哪里,如下所示
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
Run Code Online (Sandbox Code Playgroud)
注意:它还关心flavorDimensions. 我的是flavorDimensions "dev_suffix", "environment"
我知道,您对google-services.json文件should be put in the root app夹有疑问,是吗?我不一定会打破\xe2\x80\x94 的神话。您也可以将 google-services.json 文件放入其中flavor folder。像这样:
1.)google-services.json到底做了什么?
请遵循:https://stackoverflow.com/a/31598587/2382964
2.)google-services.json文件如何影响你的android studio项目?
请遵循:https://stackoverflow.com/a/33083898/2382964
简而言之,对于第二个网址,如果您在项目中添加google-services.json,则此路径中的变体 必须有自动生成的google-services文件夹debug
app/build/generated/res/google-services/debug/values/values.xml
Run Code Online (Sandbox Code Playgroud)
3.)做什么,完成它?
在project_levelbuild.gradle中添加google-services依赖项,version 3.0.0如果您使用的是app_compact库,也可以使用.
// Top-level build.gradle file
classpath 'com.google.gms:google-services:2.1.2'
Run Code Online (Sandbox Code Playgroud)
现在在app_levelbuild.gradle中你必须在底部添加.
// app-level build.gradle file
apply plugin: 'com.google.gms.google-services'
Run Code Online (Sandbox Code Playgroud)
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.
根据Firebase 文档,您还可以使用字符串资源而不是google-services.json。
由于此提供程序只是读取已知名称的资源,因此另一个选择是将字符串资源直接添加到您的应用程序中,而不是使用 Google Services gradle 插件。您可以通过以下方式执行此操作:
google-services从根 build.gradle 中删除插件google-services.json从您的项目中删除- 直接添加字符串资源
'com.google.gms.google-services'从应用程序 build.gradle 中删除 apply plugin:
例子strings.xml:
<string name="google_client_id">XXXXXXXXX.apps.googleusercontent.com</string>
<string name="default_web_client_id">XXXX-XXXXXX.apps.googleusercontent.com</string>
<string name="gcm_defaultSenderId">XXXXXX</string>
<string name="google_api_key">AIzaXXXXXX</string>
<string name="google_app_id">1:XXXXXX:android:XXXXX</string>
<string name="google_crash_reporting_api_key">AIzaXXXXXXX</string>
<string name="project_id">XXXXXXX</string>
Run Code Online (Sandbox Code Playgroud)
我们有一个不同的用于调试构建的包名 (*.debug),所以我想要一些基于风味和构建类型的东西,而不必在processDebugFlavorGoogleServices.
我在每种风格中创建了一个名为“google-services”的文件夹,其中包含 json 文件的调试版本和发布版本:
在 gradle 文件的 buildTypes 部分,添加以下内容:
applicationVariants.all { variant ->
def buildTypeName = variant.buildType.name
def flavorName = variant.productFlavors[0].name;
def googleServicesJson = 'google-services.json'
def originalPath = "src/$flavorName/google-services/$buildTypeName/$googleServicesJson"
def destPath = "."
copy {
if (flavorName.equals(getCurrentFlavor()) && buildTypeName.equals(getCurrentBuildType())) {
println originalPath
from originalPath
println destPath
into destPath
}
}
}
Run Code Online (Sandbox Code Playgroud)
当您切换构建变体时,它会自动将正确的 json 文件复制到您的应用程序模块的根目录。
在 build.gradle 的根目录中添加调用以获取当前风格和当前构建类型的两个方法
def getCurrentFlavor() {
Gradle gradle = getGradle()
String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()
Pattern pattern;
if( tskReqStr.contains( "assemble" ) )
pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
else
pattern = Pattern.compile("generate(\\w+)(Release|Debug)")
Matcher matcher = pattern.matcher( tskReqStr )
if( matcher.find() ) {
println matcher.group(1).toLowerCase()
return matcher.group(1).toLowerCase()
}
else
{
println "NO MATCH FOUND"
return "";
}
}
def getCurrentBuildType() {
Gradle gradle = getGradle()
String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()
if (tskReqStr.contains("Release")) {
println "getCurrentBuildType release"
return "release"
}
else if (tskReqStr.contains("Debug")) {
println "getCurrentBuildType debug"
return "debug"
}
println "NO MATCH FOUND"
return "";
}
Run Code Online (Sandbox Code Playgroud)
就是这样,您不必担心从 gradle 文件中删除/添加/修改口味,它会自动获取调试或发布 google-services.json。
| 归档时间: |
|
| 查看次数: |
104203 次 |
| 最近记录: |