狛ログ

2016年7月31日日曜日

AndroidでIncompatibleClassChangeErrorが発生した場合の対処。

オフィス狛 技術部です。

Android StudioのGradle設定で、dependencies・compileに設定している
外部プラグインのバージョンを最新にして、ビルド後にアプリを起動したら、以下のエラーが発生しました。

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.android.gms.iid.zzd.zzeb(Unknown Source)
   at com.google.android.gms.iid.zzd.(Unknown Source)
   at com.google.android.gms.iid.zzd.(Unknown Source)
   at com.google.android.gms.iid.InstanceID.zza(Unknown Source)
   at com.google.android.gms.iid.InstanceID.getInstance(Unknown Source)

「クラスの変換に互換性が無い」、「android.support.v4」というヒントがあります。
何より直前に行った「外部プラグインのバージョンを最新に」という作業が原因なのは間違いありません。

幸いにも、外部プラグインはソースも提供している物だったので、
早速、外部プラグイン側のGradleを見てみると・・・
dependencies {
    compile 'com.android.support:support-v4:24.0.0'
    compile 'com.android.support:appcompat-v7:24.0.0'
    compile 'com.android.support:recyclerview-v7:24.0.0'
    compile 'com.android.support:support-annotations:24.0.0'
}

となっています。
一方、本体のプロジェクトの方のSupport Libraryのバージョンは・・・
dependencies {
    compile 'com.android.support:support-v4:23.1.1'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:recyclerview-v7:23.1.1'
    compile 'com.android.support:support-annotations:23.1.1'
}

となっています。これが原因ですね。

プラグインの Support Library バージョンと、
本体のプロジェクトの Support Library バージョンが異なっていると、
今回のようなエラーが発生する可能性があります。

本体の方のバージョンを上げれば解決なのですが、
ちょっと影響範囲が不明なので、今回は、外部プラグインのバージョンを元に戻す、という事で対応しました。

一気にバージョン上げると、動かなくなる可能性があるので、
Support Library の更新は、定期的にやりましょう、という事ですね。

0 件のコメント:

コメントを投稿