我正在尝试将 Google 的 App Invites API 与我的 Android 应用程序一起使用,根据他们的指南,我需要将从开发人员控制台生成的配置文件放在项目的 app/ 目录中。我的应用程序有多种构建风格,一种用于生产、qa 和调试。我不知道它是如何工作的(因为它是一个插件)具有多种构建风格,并希望有人能对这个问题有所了解。
2 回答
根据Google services gradle plugin documentation ,该插件支持每个buildType不同的 google-services.json ,但不是每个风味
[...] 从 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文件
错误:任务“:app:processProdReleaseGoogleServices”执行失败。
模块根文件夹中缺少文件 google-services.json。没有它,Google 服务插件将无法运行。
我提交了一个错误:https ://code.google.com/p/android/issues/detail?id=200116
我对 google-services 插件和 json 进行了一些调查,并找到了该插件的来源。
第一件事:
由 classpath 和 apply 引用的 gradle-plugin google-services 只是一个构建时插件!所以它只影响你的应用程序的构建过程,而不是运行时过程!
此插件仅作为快速入门助手,可在您的应用中快速集成 Google 服务。显然,这个过程有些复杂并且没有记录,所以谷歌应该明确这个过程的作用。
事实上,我找到了插件版本 com.google.gms:google-services:1.4.0-beta3 的源代码,但没有找到任何关于 appinvites 的具体参考,也没有找到任何 Google API for App Invites!(但也许它只是使用带有项目 ID 的通用 API 项目,我没有尝试过)
它能做什么:
google-services gradle-plugin 在您的应用程序模块中查找提到的 google-services.json 文件。然后它会在 google-services.json 文件中查找由 Google API 开发人员控制台生成的项目 ID 和跟踪 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 功能。
请注意,在下面引用的源代码中,google-services 插件始终为您的 app/build.gradle 中定义的每个 app-variant 生成这些 android-resources。
如果你不想这样,你应该在你想要的应用程序变体中使用那些生成的资源,并删除其他的。不要忘记从 app/build.gradle 中删除 google-services 插件应用,否则它将为所有 app-variants 重新生成。
它没有什么:
此插件和 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:\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 文件,你会发现两个文件:
GoogleServicesPlugin.groovy
GoogleServicesTask.java
其中包含 gradle-plugin 的纯源代码。
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);
}
因此,如果 Google 文档没有说明特定 Google 功能需要哪些资源,我建议为每个相关的构建类型/风格生成 JSON 文件,查看插件生成了哪些资源,然后手动放置这些资源进入他们各自的 src/buildtypeORflavor/res 目录。
之后删除对 google-services 插件和 JSON 文件的引用,就完成了。