更新到Android Build Tools 25.1.6 GCM/FCM后出现IncompatibleClassChangeError

son*_*que 80 android google-cloud-messaging android-gradle-plugin firebase-cloud-messaging

自从我更新到Android SDK工具25.1.6和Android支持存储库32.0.0(今天早上)后,我收到以下错误,我没有更改我的代码中的任何内容,它仍在我的同事计算机上运行(Android SDK工具) 25.1.1 + Android支持存储库30.0.0).

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 com.xxxxxxx.utils.RegistrationIntentService.onHandleIntent(RegistrationIntentService.java:55)
     at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
     at android.os.Handler.dispatchMessage(Handler.java:102)
     at android.os.Looper.loop(Looper.java:145)
     at android.os.HandlerThread.run(HandlerThread.java:61)
Run Code Online (Sandbox Code Playgroud)

这是一段崩溃的代码:

InstanceID instanceID = InstanceID.getInstance(this); // <-- crash here
String instanceIDToken = instanceID.getToken(getString(R.string.google_app_id),
GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
Run Code Online (Sandbox Code Playgroud)

当我尝试从Google Cloud Messaging获取令牌时.

我正在使用分割的播放服务在Gradle中导入GCM:

 compile 'com.google.android.gms:play-services-analytics:9.0.0' 
 compile 'com.google.android.gms:play-services-maps:9.0.0'
 compile 'com.google.android.gms:play-services-location:9.0.0' 
 compile 'com.google.android.gms:play-services-gcm:9.0.0' 
 compile 'com.google.android.gms:play-services-base:9.0.0'
Run Code Online (Sandbox Code Playgroud)

EDIT 禁用GCM修复了问题,所以我的猜测是我应该迁移到Firebase Cloud Message

EDIT2 我的设备收到Google Play Services 9.0(昨天是8.4.x).现在它不再崩溃,但抱怨模块描述符

 Failed to load module descriptor class: Didn't find class "com.google.android.gms.dynamite.descriptors.com.google.firebase.auth.ModuleDescriptor"
 Firebase API initialization failure.
Run Code Online (Sandbox Code Playgroud)

有没有人有类似的错误,以及如何解决它?

FIXED 特别感谢@stegranet. ./gradlew -q app:dependencies --configuration compile帮助您确定哪些依赖项包括SDK 24.x.

主要问题是某些库使用+符号而不是版本导入最新的支持库.这会导致问题,包括最新的可用版本.

因此,请避免+登录依赖项;)

小智 37

我使用gradle依赖树为我解决了这个错误.

只需运行gradle -q app:dependencies --configuration compile 并检查输出以查找如下条目:

+--- com.mcxiaoke.viewpagerindicator:library:2.4.1
|    \--- com.android.support:support-v4:+ -> 24.0.0-beta1 (*)
Run Code Online (Sandbox Code Playgroud)

正如Diego Giorgini所说,这个版本太高了(> = 24).所以更新的依赖build.gradle

compile('com.mcxiaoke.viewpagerindicator:library:2.4.1') {
    exclude module: 'support-v4';
}
compile 'com.android.support:support-v4:23.4.0'
Run Code Online (Sandbox Code Playgroud)


Die*_*ini 35

更新可能27:

我们刚刚发布了一个update(version 9.0.1)来修复我在第一次编辑中提到的不兼容性.
请更新您的依赖项,如果仍有问题,请告知我们.

谢谢!


原答案5月20日:

您遇到的问题是由于
play-services / firebase sdk v9.0.0com.android.support:appcompat-v7 >= 24
(与android-N sdk发布的版本)不兼容

您应该能够通过定位支持库的早期版本来修复它.喜欢:

compile 'com.android.support:appcompat-v7:23.4.0'
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一似乎有效的解决方案,谢谢.如果你不介意我这么说,那些像这样的bug可能会泄漏到生产版本中,这有点可怕! (2认同)

Rea*_*hed 5

我已经更新了play-services依赖项 build.gradle

dependencies {
    compile 'com.google.android.gms:play-services:9.0.0'
}
Run Code Online (Sandbox Code Playgroud)

要通过更新google-services插件的版本来修复版本冲突,我必须build.gradle在项目的根文件夹下更新google-services

dependencies {
    classpath 'com.google.gms:google-services:3.0.0'
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处获取Google服务的最新更新.

虽然它没有避免异常,但它不再崩溃应用程序在我身边.

更新

我可以通过从Beta Channel更新Android工作室来避免崩溃.然后更新你的platform/build-tools内部SDK.

在此输入图像描述


mac*_*bee 5

我的工作如下:

app level gradle

dependencies {
 compile 'com.android.support:appcompat-v7:23.4.0'
 compile 'com.android.support:design:23.4.0'
 compile 'com.google.android.gms:play-services:9.0.0'
}
Run Code Online (Sandbox Code Playgroud)

根级gradle

dependencies {
    classpath 'com.google.gms:google-services:3.0.0'
}
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用......我将所有版本24.2.1更改为23.4.0并且getToken再次工作......这太可怕了!现在我害怕升级版本. (2认同)