将 Google 的 App Invite beta 与具有多种构建风格(生产、QA、调试等)的 Android 应用程序结合使用



我正在尝试将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

相关内容

  • 没有找到相关文章

最新更新