2

我正在尝试将 Google 的 App Invites API 与我的 Android 应用程序一起使用,根据他们的指南,我需要将从开发人员控制台生成的配置文件放在项目的 app/ 目录中。我的应用程序有多种构建风格,一种用于生产、qa 和调试。我不知道它是如何工作的(因为它是一个插件)具有多种构建风格,并希望有人能对这个问题有所了解。

4

2 回答 2

0

根据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

于 2016-02-02T13:01:01.447 回答
0

我对 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 文件的引用,就完成了。

于 2015-10-12T15:18:55.477 回答