使用谷歌的应用程序邀请测试与具有多种构建风格的Android应用程序(生产,qa,调试等)

时间:2015-06-23 15:41:53

标签: android google-app-invites

我正在尝试使用Google的App Invites API和我的Android应用程序,根据他们的guide,我需要在项目的app /目录中放置一个从开发者控制台生成的配置文件。我的应用程序有多种构建风格,一种用于生产,qa和调试。我不知道它是如何工作的(因为它是一个插头)有多种构建风味,我希望有人可以解释这个问题。

2 个答案:

答案 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