【问题标题】:Android Google Cloud Messaging (GCM) token generation crash after Firebase-related Google Play Services update与 Firebase 相关的 Google Play 服务更新后,Android Google Cloud Messaging (GCM) 令牌生成崩溃
【发布时间】:2016-05-20 03:19:15
【问题描述】:

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

当这种情况开始发生时,我没有处理与 GCM 相关的代码,所以这是出乎意料的。如果我从 Android 系统设置中卸载 Google Play 服务更新,该应用程序将不再崩溃。一旦我重新安装最新版本,应用程序每次都会再次崩溃。

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)

【问题讨论】:

  • 检查这个thread。他们建议您更新播放服务以将“com.google.android.gms:play-services:9.0.0”和谷歌服务编译为类路径“com.google.gms:google-services:3.0.0”
  • go to my answer to fix your problem GCM 2016 对我有用

标签: android firebase google-cloud-messaging


【解决方案1】:

所以问题是您的依赖项包含旧版本的支持库。看看这个帖子:

Android UrbanAirship Crash in 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'
    }
}

【讨论】:

  • 这就是解决方案!谢谢。
  • 它不起作用,我在我的项目中添加了 GCM,之后我在 API 18 及以下如何使其支持时遇到此错误。
  • 应该在根 gradle.build 上还是在项目模块上?
  • 兄弟,你让我开心。谢谢
  • @ArpitPatel 在哪里添加这个?
【解决方案2】:

试试这个就解决了

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

中的播放服务依赖项
    dependencies {
compile 'com.google.android.gms:play-services:9.0.0'}

如果有任何版本冲突,请在 build.gradle(项目 gradle)中添加它来修复它

dependencies {
classpath 'com.google.gms:google-services:3.0.0'}

【讨论】:

    【解决方案3】:

    5 月 27 日更新:

    我们刚刚发布了更新 (version 9.0.1) 以修复我在第一次编辑中提到的不兼容问题。
    请更新您的依赖项,如果这仍然是一个问题,请告诉我们。

    谢谢!


    5 月 20 日的原始答案:

    Google Play services 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'
    【解决方案4】:

    如果您已更新 Android 支持存储库,请通过替换 sdk 路径中的 m2repository 文件夹来恢复它。

    首先下载旧版m2repository

    https://dl-ssl.google.com/android/repository/android_m2repository_r31.zip

    SDK 路径

    替换 m2repository 文件夹

    【讨论】:

      【解决方案5】:

      只需更新您的 GCM 库,它就会解决您的问题。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多