在与Firebase相关的Google Play服务更新后,Android Google云消息传递(GCM)令牌生成崩溃 [英] Android Google Cloud Messaging (GCM) token generation crash after Firebase-related Google Play Services update

查看:234
本文介绍了在与Firebase相关的Google Play服务更新后,Android Google云消息传递(GCM)令牌生成崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



当这种情况发生时,我并没有解决与GCM相关的代码,所以这是意想不到的。如果我从Android系统设置中卸载Google Play服务更新,则该应用不会再崩溃。

 重大异常:IntentService [MyGCMRegistrationIntentService] 
过程:< my process>,PID:26036
java.lang.IncompatibleClassChangeError:方法java.io.File android.support.v4.content.ContextCompat.getNoBackupFilesDir(android.content.Context) '被期望是虚拟类型,但是被发现是直接类型的(在/system/framework/core-libart.jar中声明'java.lang.reflect.ArtMethod')
在com.google .android.gms.iid.zzd.zzeb(Unknown Source)
在com.google.android.gms.iid.zzd。< init>(Unknown Source)
在com.google.android。 gms.iid.zzd。< init>(Unknown Source)
com.google.android.gms.iid.InstanceID.zza(Unknown Source)
com.google.android.gms.iid .InstanceID.getInstance(未知来源)
在<包> .MyGCMRegistrationIntentService.onHandleIntent(MyGCMRegistrationInten tService.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)

以下是我的注册服务:

pre $ public $ 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();

MyGCMRegistrationIntentService()
{
super(NAME);

$ b $覆盖
保护无效的onHandleIntent(最终意图意图)
{
尝试
{
final InstanceID instanceId = InstanceID.getInstance(本);
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。);


$ b $ / code $
$ b顶级Gradle构建文件:

$ $ p $ buildscript {
repositories {
jcenter()
}
依赖关系{
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 {
知识库{
jcenter()
maven {url'https:// jitpack。 io'}
}
}

应用程序级别的Gradle构建依赖关系处理Google:

 依赖关系{
compile'c​​om.android.support:appcompat-v7:23.3.0'
编译'com.android.support:multidex:1.0.1'
编译'com.android.support:design:23.3.0'
编译'com.android.support:recyclerview-v7:23.3.0'
编译'com.android.support:support-annotations: 23.3.0'
compile'c​​om.android.support:support-v4:23.3.0'
compile'c​​om.android.support:support-v13:23.3.0'
compile' com.google.android.gms:play-services-analytics:8.4.0'
compile'c​​om.google.android.gms:play-services-gcm:8.4.0'

...(然后是我的其他依赖)
}

谷歌(我知道这是一团糟,有些东西是多余的,对不起):

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

...(然后是我的其他依赖)
}

我以为升级版本可能会有帮助。以下是我升级的内容:

  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初始化失败。 
java.lang.reflect.Method.invoke($)$ b $ java.lang.reflect.Method.invoke($ {$ B $ java.lang.reflect.Method.invoke(Method.java:372)
在com.google.firebase.FirebaseApp.zza(未知来源)
在com.google.firebase.FirebaseApp.initializeApp(未知来源)
在com.google.firebase.FirebaseApp.initializeApp (未知来源)
在com.google.firebase.FirebaseApp.zzbu(未知来源)
来自com.google.firebase.provider.FirebaseInitProvider.onCreate(未知来源)
在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.Activi在android.app.ActivityThread.access
(ActivityThread.java:151)
在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1364 )
在android.os.Handler.dispatchMessage(Handler.java:102)
在android.os.Looper.loop(Looper.java:135)
在android.app.ActivityThread。 main(ActivityThread.java:5254)
在java.lang.reflect.Method.invoke(本地方法)$ b $在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)
引起通过:java.lang.IncompatibleClassChangeError:方法'java.io.File android.support.v4.content.ContextCompat.getNoBackupFilesDir(android.content.Context)'被期望是类型虚拟,而是被发现是类型直接(声明'java.lang.reflect.ArtMethod'应用程序耳朵在/system/framework/core-libart.jar)
在com.google.firebase.iid.zzg.zzeC(未知来源)
在com.google.firebase.iid.zzg。< init>(Unknown Source)
在com.google.firebase.iid.zzg。< init>(Unknown Source)
在com.google.firebase.iid.zzd.zzb(Unknown Source)
在com.google.firebase.iid.FirebaseInstanceId.getInstance(未知源)
在java.lang.reflect.Method.invoke(本地方法)
在java.lang.reflect.Method。在com.google.firebase.FirebaseApp.zza(未知源)调用(Method.java:372)
(在com.google.firebase.FirebaseApp.initializeApp中为
)(未知源)
at com .google.firebase.FirebaseApp.initializeApp(未知来源)
,位于com.google.firebase.FirebaseApp.zzbu(未知来源)
,位于com.google.firebase.provider.FirebaseInitProvider.onCreate(未知来源)
在android.content.ContentProvider.attachInfo(ContentProvider.java:1696)
在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:工作线程上的任务异常:java.lang.IncompatibleClassChangeError:方法'java.io.File android.support.v4.content.ContextCompat.getNoBackupFilesDir(android.content.Context)'预计是类型虚拟,但是被发现是直接类型的(声明'java.lang.reflect.ArtMethod'出现在/system/framework/core-libart.jar中):com.google.android.gms.measurement.internal。 zzt.zzEd(Unknown Source)


解决方案

您拥有包含旧版本支持库的依赖关系。检查这个线程:



Android UrbanAhiphip Crash in take Off



这样做可能有帮助(从线程):

  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'
}
}


My Android application started crashing today when generating a token for Google Cloud Messaging (GCM). This happens on multiple devices and version of Android. I think it may have to do with the new Firebase features announced by Google yesterday at Google IO.

I wasn't working around the code related to GCM when this started happening so it was unexpected. If I uninstall Google Play Services updates from Android system settings, the app no longer crashes. As soon as I re-install the latest, the app starts crashing again every time.

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)

Here is my registration service:

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.");
        }
    }
}

Top-level Gradle build file:

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' }
    }
}

App-level Gradle build dependencies dealing with Google:

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)
}

Library dependencies dealing with Google (I know this is all messy and some things are redundant, sorry):

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)
}

I thought maybe upgrading the versions would help. Here is what I upgraded:

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

The application still crashes, but in a different way. First it logs the following, but does not crash.

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) 

After I move around in the app which triggers the GCM registration, I get the same stack as before along with this line before crashing:

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)

解决方案

So the issue is that you have dependencies that inlcude old versions of the support library. Check this thread out:

Android UrbanAirship Crash in takeOff

Doing this might help (from the thread):

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'
    }
}

这篇关于在与Firebase相关的Google Play服务更新后,Android Google云消息传递(GCM)令牌生成崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆