使用Google Cloud Messaging的App Engine后端有哪些必要的依赖关系?

时间:2015-12-29 17:31:37

标签: android google-app-engine google-play-services

使用Google Cloud Messaging的App Engine后端有哪些必要的gradle依赖关系?

目前,当您将类似模块添加到Android Studio项目时,它会添加此依赖项:

'compile'c​​om.google.android.gms:play-services:8.4.0'

但是,当您运行该项目时,会出现此错误:

  

错误:任务执行失败   ':应用程序:transformClassesWithDexForDebug'。

     
    

com.android.build.api.transform.TransformException:com.android.ide.common.process.ProcessException:     org.gradle.process.internal.ExecException:进程'命令     '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'”     完成非零退出值2

  

有人建议使用这个:

defaultConfig {
        multiDexEnabled true
}

但这实际上对我不起作用。

所以看来我只需要为GAE + GCM指定所需的库。到目前为止,我有:

compile 'com.google.android.gms:play-services-auth:8.4.0'
compile 'com.google.android.gms:play-services-gcm:8.4.0'
compile 'com.google.android.gms:play-services-base:8.4.0'

full list here。但那没用。我收到了这个错误:

  

E / GMPM:GoogleService初始化失败,状态:10,缺少一个   预期资源:'R.string.google_app_id'用于初始化Google   服务。可能的原因是缺少google-services.json或   com.google.gms.google-services gradle plugin。

所以我不知所措。

还有其他方法解决这个问题吗?奇怪的是,我的旧GAE + GCM项目可以很好地导入整个Google Play服务。但是,在我的新项目中导入旧版本的Google Play服务并不起作用。所以我不确定发生了什么。

编辑:更多信息:

我做了一些测试。

1)开始新的Android Studio项目,添加了新的谷歌云模块“App Engine Java端点模块”。自动生成的build.grade(Module:app)如下所示:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
    compile project(path: ':backend', configuration: 'android-endpoints')
}

结果?编译并运行完美 - 没问题!

2)开始新的Android Studio项目,添加了新的谷歌云模块'App Engine后端与谷歌云消息'。自动生成的build.grade(Module:app)如下所示:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
    compile 'com.google.android.gms:play-services:8.4.0'
    compile project(path: ':backend', configuration: 'android-endpoints')
}

结果?我得到的同样糟糕的错误!

所以看起来像'compile'c​​om.google.android.gms:play-services:8.4.0''是问题所在。我用

替换了它

'compile'c​​om.google.android.gms:play-services-gcm:8.4.0''

因为从理论上讲,这就是我所需要的谷歌云消息传递。当我运行它时,我得到了这个:

  

12-30 14:14:16.482 10573-10573 / com.myapp.myapp   E / GMPM:GoogleService初始化失败,状态:10,缺少一个   预期资源:'R.string.google_app_id'用于初始化Google   服务。可能的原因是缺少google-services.json或   com.google.gms.google-services gradle插件。 12-30 14:14:16.482   10573-10573 / com.myapp.myapp E / GMPM:调度程序没有   组。不记录错误/警告。 12-30 14:14:16.502   10573-10623 / com.myapp.myapp E / GMPM:上传是   不可能。应用程序测量已禁用

所以看起来我错过了这个google-services.json文件或其他东西。我不知道Android Studio发生了什么,因为几个月前我以同样的方式创建了一个支持GCM的应用程序,并且编译没有问题。该应用程序的gradle.build文件如下所示:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile project(path: ':gcm-backend', configuration: 'android-endpoints')
    compile 'com.android.support:appcompat-v7:22.2.0'
    compile 'com.ganyo:gcm-server:1.0.2'
    compile 'com.google.android.gms:play-services:7.5.0'
    compile 'com.android.support:support-v4:22.2.0'
}

所以看起来Android Studio停止添加'compile'c​​om.ganyo:gcm-server:1.0.2''依赖。

所以我用

运行了一个项目
'compile 'com.ganyo:gcm-server:1.0.2'
'compile 'com.google.android.gms:play-services:8.4.0'

结果?相同执行失败错误。

好的,让我们在我的新项目中尝试旧的游戏服务库:

'compile 'com.ganyo:gcm-server:1.0.2'
'compile 'com.google.android.gms:play-services:7.5.0'

结果?相同执行失败错误。

我只是不明白为什么这不像过去那样开箱即用......

3 个答案:

答案 0 :(得分:3)

因此,这应该被视为Android Studio的一个问题,因为只需添加一个模块“App Engine后端与Google云消息传递”即使最简单的应用程序也会破坏构建,因为完整的Google Play服务依赖性com.google.android.gms:play-services:8.4.0'足够大,可以自己超过65K DEX方法限制。这个问题实际上记录在“Setting Up Google Play Services”中。

正如您所发现的,解决方案是手动编辑build.gradle并仅为GCM“com.google.android.gms:play-services-gcm:8.4.0”添加导入。手动添加“google-services.json”的要求是正常的,因为您需要在developers.google.com上为您的项目生成它。添加'multiDexEnabled true'不是一个好的解决方案,因为它会不必要地增加你的APK大小,并且你最终仍然会有重复的依赖。

我已经创建了一个entry on the Android issue tracker来修复Android Studio中App Engine GCM后端模块的依赖关系。请随意为此问题加注明星的可见性和更新。

答案 1 :(得分:1)

初步测试表明,到目前为止这种方法有效。

我在这里查看了Google GCM示例项目:https://github.com/googlesamples/google-services/tree/master/android/gcm

并编辑了我的gradle文件。这是他们现在的样子:

APP:

<?php
date_default_timezone_set('Europe/London'); // set it to the right value

$weAreOpen = areWeOpen(date('l'), date('G'), date('i'));

if($weAreOpen) {
echo 'We are open for business';
} else {
echo 'We are closed';
}

/**
 * Test if we're open for business
 * @param string $day - day of week (ex: Monday)
 * @param string $hour - hour of day (ex: 9)
 * @param string $minute - minute (ex: 42)
 * @return bool - true if open interval 
 */
function areWeOpen($day, $hour, $minute) {
switch($day) {
    case 'Monday':
        if($hour >= 9 && $hour < 21) {
            return true;
        }
        break;
    case 'Tuesday':
        if(($hour + $minute/60) >= 10.5 && $hour < 21) {
            return true;
        }
        break;
    case 'Wednesday':
        if($hour >= 9 && $hour < 21) {
            return true;
            }
        break;
    case 'Thursday':
        if($hour >= 9 && $hour < 21) {
            return true;
                }
            break;
    case 'Friday':
        if($hour >= 9 && $hour < 21) {
            return true;
        }
        break;
    case 'Saturday':
        if($hour >= 9 && $hour < 21) {
            return true;
        }
        break;
    case 'Sunday':
        if($hour >= 10 && $hour < 16) {
            return true;
        }
        break;
}
return false;
}

?>

PROJECT:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.me.myapp"
        minSdkVersion 13
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.google.android.gms:play-services-gcm:8.4.0'
    testCompile 'junit:junit:4.12'
    compile project(path: ':backend', configuration: 'android-endpoints')
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
}

apply plugin: 'com.google.gms.google-services'

我还按照this指南(参见步骤2)生成了google-services.json文件,我将其放入app /目录。

现在应用程序编译并运行(至少到目前为止)。

我真的很生气这与使用自动生成的gradle文件开箱即用,而且我必须在一些示例应用中搜索它们。几个月前,它还没有成为这种方式。一旦添加了GCM模块,它就会起作用。

如果其他人对未来的项目有任何提示/建议,请告诉我。 = d

答案 2 :(得分:0)

如果您确实进入了需要在启用MultiDex的情况下运行的阶段,则需要执行三个步骤:

  1. 在您尝试过的Gradle中的defaultConfig中启用它:

    defaultConfig {
        ...
        minSdkVersion 14
        targetSdkVersion 21
        ...
    
        // Enabling multidex support.
        multiDexEnabled true
    }
    
  2. 将其包含在您的依赖项中:

    dependencies {
        compile 'com.android.support:multidex:1.0.0'
    }
    
  3. 将其添加到您的清单中:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.android.multidex.myapplication">
        <application
            ...
            android:name="android.support.multidex.MultiDexApplication">
            ...
        </application>
    </manifest>
    
  4. https://developer.android.com/intl/es/tools/building/multidex.html#about

    但总是要好好看看你已经拥有的依赖关系,因为它通常是不需要的。