java.lang.NoClassDefFoundError:android / graphics / drawable / Icon


95

これまでのところ、ルート権限を取得した電話(SM-G900R7 Android 4.4.2)を使用する1人のユーザーに対してのみこのエラーが発生しました。エラーは次のようなものです:

Fatal Exception: java.lang.NoClassDefFoundError: android/graphics/drawable/Icon
       at java.lang.Class.getDeclaredMethods(Class.java)
       at java.lang.Class.getDeclaredMethods(Class.java:656)
       at android.view.ViewDebug.getExportedPropertyMethods(ViewDebug.java:960)
       at android.view.ViewDebug.exportMethods(ViewDebug.java:1047)
       at android.view.ViewDebug.dumpViewProperties(ViewDebug.java:997)
       at android.view.ViewDebug.dumpViewProperties(ViewDebug.java:983)
       at android.view.ViewDebug.dumpView(ViewDebug.java:900)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:870)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dump(ViewDebug.java:793)
       at android.view.ViewDebug.dispatchCommand(ViewDebug.java:416)
       at android.view.ViewRootImpl$W.executeCommand(ViewRootImpl.java:6258)
       at android.view.IWindow$Stub.onTransact(IWindow.java:65)
       at android.os.Binder.execTransact(Binder.java:404)
       at dalvik.system.NativeStart.run(NativeStart.java)

私はコードでandroid.graphics.drawable.Iconを使用していません。すべての使用方法はコードからのものでandroid.support.v4.graphics.drawable.IconCompatあり、コードでそのクラスを使用することもありません...

ところで私のサポートライブラリは version 26.0.0, my minSdkVersion is 15 targetSdkVersion is 26.

ありがとう


4
私にとって同じ問題。同じルート化デバイス、同じAndroidバージョン。解決策は見つかりましたか?
クリス

24
私に当てさせてください?Android 4を実行しているSamsungデバイス?
Noman Rafique 2017

7
@NomanRafique Samsung S5、4.4.2、根ざし。
ヴァイデン2017

2
crashlyitcsを介して同じデバイス、同じデバイスが報告されています。ほとんどすべての新しいバージョンの1つのインスタンス、および公開直後。私のアプリにはmultidexがあります。
djxstream 2017

回答:


40

更新

この問題はサポートライブラリ27.0.0で修正されています。更新する場合は、変更することも忘れないでくださいcompileSdkVersion 27

何が起こっている?

Android 4.4を搭載したSamsungデバイスViewは、クラスパスを拡張するクラスが、クラスパスにないタイプのパラメーターを返すか、または受け取るメソッドを定義すると、このようにクラッシュします。

サポートライブラリバージョン25.4.0以降AppCompatImageView、メソッドをAppCompatImageButton誤ってオーバーライドしますsetImageIcon(Icon)IconクラスはAPI 23で導入されたため、アプリはAPI 19のSamsungデバイスでクラッシュします。

オーバーライドしようとすると、同様のことが起こりますView.onApplyWindowInsets(WindowInsets)

サポートライブラリ26.1.0の回避策

これが正式な方法で修正されるまで、サポートライブラリの古いバージョンに行き詰まっている場合appcompat-v7は、setImageIconメソッドのすべてのトレースが削除されたの修正バージョンを作成しました。つまり、Android 4.4搭載のSamsungではクラッシュしません。

これをアプリのbuild.gradleの下部に配置します。

repositories {
    maven { url "https://dl.bintray.com/consp1racy/maven" }
}

configurations.all {
    resolutionStrategy.eachDependency { details ->
        def requested = details.requested
        if (requested.group == 'com.android.support' && requested.name == 'appcompat-v7') {
            details.useTarget 'net.xpece.android:support-appcompat-v7-fixed:26.1.0-1'
        }
    }
}

このコードは、appcompat-v7依存関係を記述された変更されたアーティファクトに置き換えます。

現在サポートされている修正バージョンは26.1.0のみです。

警告:コピーして貼り付ける前にコードを理解し、不明なソースからコードを取得するときは常に注意してください。


サポートライブラリを> 26.1.0に更新する必要がある場合、将来どうなりますか?あなたの修正は時代遅れになると思いますよね?
Dika

2
@Dika心配ありません。次のリリースで修正される予定です。
Eugen Pechanec、2017年

1
@Chisko異なるサポートライブラリの複数のバージョンを使用しないでください。すべてのサポートライブラリを26.1.0に安全に更新できると思います。修正は、その1つのバージョンに対してのみリリースされます。
Eugen Pechanec

1
@Chiskoそれはただの習慣の力です。多くの人はサポートライブラリが相互接続されていることを知らないため、異なるバージョンを使用するとクラッシュする可能性があります。:)
Eugen Pechanec 2017年

1
@Alex私はAppCompat 27.0.0のソースをたどったところです。2つのオプション:1)どういうわけか古いサポートライブラリをまだ使用しています。解決された依存関係を確認します。2)同じ例外が別の場所でスローされ、クラスが異なるためです。クラッシュレポートまたはスタックトレースを共有できますか?調べてみます。
Eugen Pechanec

14

この問題はサポートライブラリ27.0.0で解決されました。

Android Gradleプラグイン3.x:

implementation 'com.android.support:appcompat-v7:27.0.0'
implementation 'com.android.support:support-v4:27.0.0'

Android Gradleプラグイン2.x:

compile 'com.android.support:appcompat-v7:27.0.0'
compile 'com.android.support:support-v4:27.0.0'

SDKレベル27に対してもコンパイルする必要があることに注意してください。


1

このクラッシュは、サポートライブラリのバージョン25.4.0に関連しています。

25.3.1バージョンを使用します。

交換する

compile 'com.android.support:appcompat-v7:25.4.0'
compile 'com.android.support:support-v4:25.4.0'

と:

compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:support-v4:25.3.1'

これにより、にロックされることに注意してくださいcompileSdkVersion 25。25.4.0以降に導入されたAndroid O APIとサポートライブラリ機能はありません(たとえば、画像ビューのドローアブルの着色やベクターパスのモーフィングバックポート)。ここではサポートライブラリチェンジだdeveloper.android.com/topic/libraries/support-library/...は
オイゲン・Pechanec

-1

2つのオプションがあります。

  1. サポートライブラリのバージョンを変更しましたか?これは、リソースが同じ名前で「保存」されていない場合、またはまったく保存されていない場合の、非常に古典的なライブラリの問題です。そのあなたではなく、そのグーグル。サポートlib 25を使用してみて、このエラーが引き続き発生するかどうかを確認してください。
  2. プロジェクトをクリーンアップして再構築してください。たぶんあなたはあなたのビルドフォルダにいくつかの古いライブラリバージョンを保持しているかもしれません、そしてあなたがプロジェクトをビルドするときそれはそれから古い値を取ります。

1
答えてくれてありがとう、2。フルグラドルクリアを何度もやった。1.の場合、targetSdkVersionが26です。最新のAPIをターゲットにしていない場合、Android Studioは警告を表示し、targetSdkVersionよりも古いバージョンのサポートlibを使用すると、Android Studioもエラーを表示します。
cn123h 2017

1
SDK 26に更新した後に同じ問題
amouly

@ cn123hどのバージョンのサポートライブラリを使用していますか?
スーフィアン

@amoulyとあなたのサポートlibバージョンは?
スーフィアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.