我正在尝试将Google的App Invites API与我的Android应用程序一起使用,根据他们的指导,我需要将从开发者控制台生成的配置文件放在项目的App/目录中。我的应用程序有多种构建风格,一种用于生产、qa和调试。我不知道这是如何工作的(因为它是一个插件),有多种构建风格,我希望有人能对这个问题有所了解。
我调查了一些关于谷歌服务插件和json的信息,并找到了这个插件的来源。
第一件事:
classpath和apply引用的gradle插件google服务只是一个构建时插件!因此,它只会影响应用程序的构建过程,而不会影响运行时过程!
这个插件只是一个快速启动的助手,可以在你的应用程序中快速集成谷歌服务。显然,这个过程有些复杂,而且没有记录在案,所以谷歌应该明确说明这个过程的作用。
事实上,我找到了插件版本com.google.gms:google-services:1.4.0-beta3的源代码,没有找到任何关于appinvites的具体参考,也没有找到任何用于appinvites的google API!(但也许它只是使用了一个通用的API项目及其项目id,我没有尝试过)
它的作用:
谷歌服务gradle插件在您的应用程序模块中查找提到的谷歌服务.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
例如,如果您遵循GCM教程,JSON文件将包括API项目的id,如下android-resource:
<string name="gcm_defaultSenderId">project-id</string>
因此,这个插件和JSON文件对于运行或发布应用程序来说并不重要,它只是一个快速启动助手,可以生成一些基本的android-resource文件,从而更容易地集成特定的Google API功能。
请注意,在下面引用的源代码中,谷歌服务插件总是为您的应用程序/build.gradle.中定义的每个应用程序变体生成这些android资源
如果你不想这样,你应该在你想要的应用程序变体中使用那些生成的资源,并删除其他资源。不要忘记从app/build.gradle中删除谷歌服务插件应用程序,否则它将为所有应用程序变体重新生成。
它没有:
这个插件和JSON文件不会直接影响你的应用程序的上述谷歌功能的内部工作!如果你已经在developer.android.com上学习了关于如何集成的旧教程,例如GCM或谷歌分析,那么你甚至不需要集成gradle插件谷歌服务或谷歌服务.json文件!
关于我在哪里找到来源的通知:
在你集成了谷歌服务gradle插件后,当同步你的项目时,gradle会自动将谷歌服务依赖项下载到类似的路径(在Windows上,你可能需要查看你的主页/.gradle for Linux):
C: \Users\user\.gradle\caches\modules-2\files-2.1\com.google.gms\google services\1.4.0-beta3\f1580f62e3be313eba041ce19b64fd3f44cf8951\google-services-1.4.0-beta3-sources.jar
如果你提取这个jar文件,你会发现两个文件:
GoogleServicesPlugin.groovy
GoogleServicesTask.java
其中包含gradle插件的纯源代码。
GoogleServicesPlugin.groovy
包含应用程序变体的处理和路径等的基本定义。
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);
}
因此,如果谷歌文档没有说明特定的谷歌功能需要哪些资源,我建议为每个相关的构建类型/风格生成JSON文件,看看插件生成了哪些资源,然后手动将这些资源放入各自的src/buildtypeORflavor/res目录中。
删除对谷歌服务插件的引用和之后的JSON文件,就完成了。
根据Google services gradle插件文档,该插件支持不同的Google services.jsonperbuildType,但不支持per风味
[…]从2.0.0-alpha3版本起,为添加了插件支持构建类型,这将使以下目录结构有效:
app/src/
main/google-services.json dogfood/google-services.json mytype1/google-services.json
然而,它对我不起作用。我正在使用2.0.0-alpha9,Gradle仍然抱怨在根文件夹中找不到googleservices.json文件
错误:任务执行失败":app:processProdReleaseGoogleServices"。
模块根文件夹中缺少文件google-services.json。谷歌服务插件没有它就无法运行。
我提交了一个错误:https://code.google.com/p/android/issues/detail?id=200116