1. ホーム
  2. android

[解決済み] Android Build Tools 25.1.6 GCM / FCM にアップデート後、IncompatibleClassChangeError が発生する。

2023-07-24 20:25:06

質問

Android SDK Tools 25.1.6 と Android Support Repository 32.0.0 にアップデートしてから (今朝)、次のようなエラーが発生しました。私のコードには何も変更がなく、同僚のコンピューター (Android SDK Tools 25.1.1 + Android Support Repository 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)

以下は、クラッシュしたコードの一部です。

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

Google Cloud Messagingからトークンを取得しようとしたときです。

Gradleでplay-servicesを分割して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'

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.

同じようなエラーが発生した方はいらっしゃいますか?

修正済み special thanks to @stegranet. ./gradlew -q app:dependencies --configuration compile は、SDK 24.x を含む依存関係を識別するのに役立ちます。

主な問題は、いくつかのライブラリが、最新のサポートライブラリを + という記号を使うことです。このため、最新版を取り込むことで問題が発生します。

そのため + のような依存関係のある記号は避けるべきです。)

どのように解決するのですか?

私はこのエラーを解決するために、gradleの依存関係ツリーを使用しました。

ただ、実行する gradle -q app:dependencies --configuration compile を実行し、このようなエントリーがないか出力を確認してください。

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

として ディエゴ・ジョルジーニ は、このバージョンは高すぎる (>=24) と言っています。 そこで build.gradle のように

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