安卓Google Cloud Messaging (GCM)在Firebase相关的Google Play Services更新后生成令牌时崩溃

25

我的安卓应用在生成Google Cloud Messaging (GCM) token时,今天开始崩溃。这在多个设备和Android版本上都发生了。我认为这可能与Google昨天在Google IO上宣布的新Firebase功能有关。

当这种情况发生时,我并没有在与GCM相关的代码周围工作,因此这是意外的。如果我从Android系统设置中卸载Google Play Services更新,则应用程序不再崩溃。但一旦重新安装最新版本后,该应用程序会再次每次崩溃。

FATAL EXCEPTION: IntentService[MyGCMRegistrationIntentService]
Process: <my process>, PID: 26036
java.lang.IncompatibleClassChangeError: The method 'java.io.File android.support.v4.content.ContextCompat.getNoBackupFilesDir(android.content.Context)' was expected to be of type virtual but instead was found to be of type direct (declaration of 'java.lang.reflect.ArtMethod' appears in /system/framework/core-libart.jar)
    at com.google.android.gms.iid.zzd.zzeb(Unknown Source)
    at com.google.android.gms.iid.zzd.<init>(Unknown Source)
    at com.google.android.gms.iid.zzd.<init>(Unknown Source)
    at com.google.android.gms.iid.InstanceID.zza(Unknown Source)
    at com.google.android.gms.iid.InstanceID.getInstance(Unknown Source)
    at <package>.MyGCMRegistrationIntentService.onHandleIntent(MyGCMRegistrationIntentService.java:<line number>);
    at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.os.HandlerThread.run(HandlerThread.java:61)

以下是我的注册服务:

public class MyGCMRegistrationIntentService extends IntentService
{
    public static final String KEY_GCM_TOKEN = "gcm_token";

    public static final String KEY_GCM_INSTANCE_ID = "gcm_instance_id";

    private static final String NAME = MyGCMRegistrationIntentService.class.getSimpleName();

    public MyGCMRegistrationIntentService()
    {
        super(NAME);
    }

    @Override
    protected void onHandleIntent(final Intent intent)
    {
        try
        {
            final InstanceID instanceId = InstanceID.getInstance(this);
            final String token = instanceId.getToken(getGCMSenderID(), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
            final String instanceIdId = instanceId.getId();
            sendTokenToMyServer(token, instanceIdId);
        }
        catch (final IOException e)
        {
            Timber.e(e, "Error getting GCM token.");
        }
    }
}

顶层Gradle构建文件:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0'
        classpath 'de.felixschulze.gradle:gradle-hockeyapp-plugin:3.3'
        classpath 'com.android.tools.build:gradle:2.1.0'
        classpath 'com.google.gms:google-services:2.1.0'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
    }
}

allprojects {
    repositories {
        jcenter()
        maven { url 'https://jitpack.io' }
    }
}

处理与Google相关的应用级Gradle构建依赖:

dependencies {
    compile 'com.android.support:appcompat-v7:23.3.0'
    compile 'com.android.support:multidex:1.0.1'
    compile 'com.android.support:design:23.3.0'
    compile 'com.android.support:recyclerview-v7:23.3.0'
    compile 'com.android.support:support-annotations:23.3.0'
    compile 'com.android.support:support-v4:23.3.0'
    compile 'com.android.support:support-v13:23.3.0'
    compile 'com.google.android.gms:play-services-analytics:8.4.0'
    compile 'com.google.android.gms:play-services-gcm:8.4.0'

    ...(and then the rest of my dependecies)
}

涉及与Google相关的库依赖关系(我知道这一切都很混乱,而且有些东西是冗余的,抱歉):

dependencies {
    compile 'com.android.support:appcompat-v7:23.3.0'
    compile 'com.android.support:cardview-v7:23.3.0'
    compile 'com.android.support:recyclerview-v7:23.3.0'
    compile 'com.android.support:support-v4:23.3.0'
    compile 'com.android.support:support-v13:23.3.0'
    compile 'com.google.android.gms:play-services-location:8.4.0'
    compile 'com.google.android.gms:play-services-analytics:8.4.0'
    compile 'com.google.android.gms:play-services-gcm:8.4.0'

    ...(and then the rest of my dependecies)
}

我想升级版本可能会有所帮助,这是我升级的内容:

com.google.gms:google-services:2.1.0 -> com.google.gms:google-services:3.0.0
com.google.android.gms:play-services-XXX:8.4.0' -> com.google.android.gms:play-services-XXX:9.0.0

应用程序仍然崩溃,但是以不同的方式。首先,它记录了以下内容,但没有崩溃。

Firebase API initialization failure.
 java.lang.reflect.InvocationTargetException
     at java.lang.reflect.Method.invoke(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:372)
     at com.google.firebase.FirebaseApp.zza(Unknown Source)
     at com.google.firebase.FirebaseApp.initializeApp(Unknown Source)
     at com.google.firebase.FirebaseApp.initializeApp(Unknown Source)
     at com.google.firebase.FirebaseApp.zzbu(Unknown Source)
     at com.google.firebase.provider.FirebaseInitProvider.onCreate(Unknown Source)
     at android.content.ContentProvider.attachInfo(ContentProvider.java:1696)
     at android.content.ContentProvider.attachInfo(ContentProvider.java:1671)
     at com.google.firebase.provider.FirebaseInitProvider.attachInfo(Unknown Source)
     at android.app.ActivityThread.installProvider(ActivityThread.java:4999)
     at android.app.ActivityThread.installContentProviders(ActivityThread.java:4594)
     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4534)
     at android.app.ActivityThread.access$1500(ActivityThread.java:151)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)
     at android.os.Handler.dispatchMessage(Handler.java:102)
     at android.os.Looper.loop(Looper.java:135)
     at android.app.ActivityThread.main(ActivityThread.java:5254)
     at java.lang.reflect.Method.invoke(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:372)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
  Caused by: java.lang.IncompatibleClassChangeError: The method 'java.io.File android.support.v4.content.ContextCompat.getNoBackupFilesDir(android.content.Context)' was expected to be of type virtual but instead was found to be of type direct (declaration of 'java.lang.reflect.ArtMethod' appears in /system/framework/core-libart.jar)
     at com.google.firebase.iid.zzg.zzeC(Unknown Source)
     at com.google.firebase.iid.zzg.<init>(Unknown Source)
     at com.google.firebase.iid.zzg.<init>(Unknown Source)
     at com.google.firebase.iid.zzd.zzb(Unknown Source)
     at com.google.firebase.iid.FirebaseInstanceId.getInstance(Unknown Source)
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.google.firebase.FirebaseApp.zza(Unknown Source) 
     at com.google.firebase.FirebaseApp.initializeApp(Unknown Source) 
     at com.google.firebase.FirebaseApp.initializeApp(Unknown Source) 
     at com.google.firebase.FirebaseApp.zzbu(Unknown Source) 
     at com.google.firebase.provider.FirebaseInitProvider.onCreate(Unknown Source) 
     at android.content.ContentProvider.attachInfo(ContentProvider.java:1696) 
     at android.content.ContentProvider.attachInfo(ContentProvider.java:1671) 
     at com.google.firebase.provider.FirebaseInitProvider.attachInfo(Unknown Source) 
     at android.app.ActivityThread.installProvider(ActivityThread.java:4999) 
     at android.app.ActivityThread.installContentProviders(ActivityThread.java:4594) 
     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4534) 
     at android.app.ActivityThread.access$1500(ActivityThread.java:151) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5254) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698

在我在应用程序中移动,触发GCM注册后,我会得到与之前相同的堆栈以及在崩溃之前出现的这行内容:

E/FA: Task exception on worker thread: java.lang.IncompatibleClassChangeError: The method 'java.io.File android.support.v4.content.ContextCompat.getNoBackupFilesDir(android.content.Context)' was expected to be of type virtual but instead was found to be of type direct (declaration of 'java.lang.reflect.ArtMethod' appears in /system/framework/core-libart.jar): com.google.android.gms.measurement.internal.zzt.zzEd(Unknown Source)

请查看此线程。他们建议您将play服务更新到compile 'com.google.android.gms:play-services:9.0.0',并将google服务更新到classpath 'com.google.gms:google-services:3.0.0'。 - ReyAnthonyRenacia
请前往我的答案以解决你的问题:go to my answer to fix your problem。这个方法在我使用GCM 2016时有效。 - skygirl
5个回答

30

问题在于你的依赖项包含旧版本的支持库。请查看此线程:

Android UrbanAirship中的takeOff崩溃

按照以下步骤操作可能会有所帮助(来源于该线程):

configurations.all {
    resolutionStrategy {
        force 'com.android.support:design:23.4.0'
        force 'com.android.support:support-v4:23.4.0'
        force 'com.android.support:appcompat-v7:23.4.0'
    }
}

2
这就是解决方案!谢谢。 - Stephen
它不起作用了,我在项目中添加了GCM后,在API 18及以下版本中出现了这个错误,如何使其支持。 - YLS
这应该放在根目录的gradle.build文件还是项目模块中? - Hendra Anggrian
你让我感到开心,兄弟。谢谢。 - Arpit Patel
1
@ArpitPatel 这个要添加在哪里? - rookieDeveloper
@Joe Munoz 非常感谢,你帮我节省了时间 :) - TheFlash

6
尝试一下,它会解决问题。
configurations.all {
resolutionStrategy {
    force 'com.android.support:design:23.4.0'
    force 'com.android.support:support-v4:23.4.0'
    force 'com.android.support:appcompat-v7:23.4.0'
}

如果您仍然有问题,您可以按照以下方式解决:

更新 build.gradle 中的play-services依赖项

    dependencies {
compile 'com.google.android.gms:play-services:9.0.0'}

如果有版本冲突,可以通过在项目gradlebuild.gradle中添加以下内容来解决。
dependencies {
classpath 'com.google.gms:google-services:3.0.0'}

4

5月27日更新:

我们刚刚发布了一个更新 (版本9.0.1) 来修复我在第一次编辑中提到的不兼容问题。
请更新你的依赖库,并让我们知道这是否仍然是一个问题。

谢谢!


原始答案 5月20日:

Google Play服务SDK的版本9.0.0与支持库版本24.x (为支持Android-N而发布的版本) 不兼容。

请确保您正在使用:

dependencies {
    compile 'com.android.support:appcompat-v7:23.3.0'
}

而不是 com.android.support:appcompat-v7:24.*


他正在使用 compile 'com.android.support:appcompat-v7:23.3.0'。 - EpicPandaForce

1

只需更新您的GCM库,即可解决您的问题。

compile "com.google.android.gms:play-services-gcm:9.2.0"

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接