我正在尝试使用Google的App Invites API和我的Android应用程序,根据他们的guide,我需要在项目的app /目录中放置一个从开发者控制台生成的配置文件。我的应用程序有多种构建风格,一种用于生产,qa和调试。我不知道它是如何工作的(因为它是一个插头)有多种构建风味,我希望有人可以解释这个问题。
答案 0 :(得分:0)
我对google-services插件和json进行了一些调查,并找到了这个插件的来源。
首先要做的事情:
classpath和apply引用的gradle-plugin google-services只是一个构建时插件!所以它只会影响你的应用程序的构建过程,而不会影响运行时进程!
此插件仅作为快速入门帮助您在应用中快速集成Google服务。显然,这个过程有点复杂,没有记录,因此谷歌应该明确这个过程的作用。
事实上,我找到了插件版本com.google.gms的源代码:google-services:1.4.0-beta3并没有找到关于appinvites的任何具体参考,也没有找到任何适用于App Invites的Google API ! (但也许它只是使用一个带有项目ID的通用API项目,我没试过这个)
它的作用:
google-services gradle-plugin会在您的应用模块中查找上述google-services.json文件。然后,它会查找由Google API开发者控制台生成的google-services.json文件中的已配置设置,例如project-id和tracking-id等。 根据它找到的设置,Android资源值将生成到以下路径中:
$project.buildDir/generated/res/google-services/$variant.dirName/values/values.xml
例如,对于应用的调试版本:
app/generated/res/google-services/debug/values/values.xml
E.g。如果您按照GCM教程,JSON文件将包含API项目的id作为以下android-resource:
<string name="gcm_defaultSenderId">project-id</string>
因此,此插件和JSON文件对于运行或发布应用程序并不重要,它只是生成一些基本的android资源文件的快速入门助手,可以更轻松地集成特定的Google API功能。
请注意,在下面引用的源代码中,google-services插件始终会为app / build.gradle中定义的每个app-variant生成这些android-resources。
如果您不想这样,您应该在所需的应用变体中使用这些生成的资源,并删除其他资源。不要忘记从app / build.gradle中删除google-services插件,否则将为所有应用变体重新生成。
它没有:
此插件和JSON文件不直接影响您的应用程序的所述Google功能的内部工作方式! 如果您已经在developer.android.com上关注了如何集成的旧教程,例如GCM或Google Analytics,您甚至无需集成gradle-plugin google-services或google-services.json文件!
请注意我在哪里找到了来源:
在集成google-services gradle-plugin并同步项目后,Gradle会自动将google-services依赖项下载到与此类似的路径(在Windows上,您可能需要查看home / .gradle for Linux ):
C:\用户\用户\ .gradle \缓存\模块-2 \文件-2.1 \ com.google.gms \ Google处理服务\ 1.4.0-β3\ f1580f62e3be313eba041ce19b64fd3f44cf8951 \ Google处理服务-1.4.0-β3 -sources.jar
如果您解压缩此jar文件,您将找到两个文件:
GoogleServicesPlugin.groovy
GoogleServicesTask.java
包含gradle-plugin的普通源代码。
GoogleServicesPlugin.groovy
包含app变体的处理和路径的基本定义等。
GoogleServicesTask.java
包含实际的任务定义,查找以下方法以查看其真正的作用:
@TaskAction
public void action() throws IOException {
checkVersionConflict();
// google-services.json
if (!quickstartFile.isFile()) {
getLogger().warn("File " + quickstartFile.getName() + " is missing from module root folder." +
" The Google Services Plugin cannot function without it.");
// Skip the rest of the actions because it would not make sense if `quickstartFile` is missing.
return;
}
// delete content of outputdir.
deleteFolder(intermediateDir);
if (!intermediateDir.mkdirs()) {
throw new GradleException("Failed to create folder: " + intermediateDir);
}
JsonElement root = new JsonParser().parse(Files.newReader(quickstartFile, Charsets.UTF_8));
if (!root.isJsonObject()) {
throw new GradleException("Malformed root json");
}
JsonObject rootObject = root.getAsJsonObject();
Map<String, String> resValues = new TreeMap<String, String>();
handleProjectNumber(rootObject, resValues);
JsonObject clientObject = getClientForPackageName(rootObject);
if (clientObject != null) {
handleAnalytics(clientObject, resValues);
handleAdsService(clientObject, resValues);
handleGoogleAppId(clientObject, resValues);
} else {
getLogger().warn("No matching client found for package name '" + packageName + "'");
}
// write the values file.
File values = new File(intermediateDir, "values");
if (!values.exists() && !values.mkdirs()) {
throw new GradleException("Failed to create folder: " + values);
}
Files.write(getValuesContent(resValues), new File(values, "values.xml"), Charsets.UTF_8);
}
因此,如果Google-docs没有说明特定Google功能需要哪些资源,我建议为每个相关的构建类型/风格生成JSON文件,查看插件生成的资源然后放入这些资源手动进入各自的src / buildtypeORflavor / res目录。
之后删除对google-services插件和JSON文件的引用,您就完成了。
答案 1 :(得分:0)
根据Google services gradle plugin documentation,该插件支持不同的 google-services.json 每 buildType ,但不支持 flavor 强>
[...]从版本2.0.0-alpha3添加了插件支持 构建类型,这将使以下目录结构有效:
应用程序/ SRC /
main/google-services.json dogfood/google-services.json mytype1/google-services.json
然而,这对我不起作用。我正在使用 2.0.0-alpha9 而Gradle仍然抱怨它无法在根文件夹中找到 google-services.json 文件
错误:任务执行失败 ':应用程序:processProdReleaseGoogleServices'。
模块根文件夹中缺少文件google-services.json。没有它,Google服务插件就无法运行。
我提交了一个错误:https://code.google.com/p/android/issues/detail?id=200116