web-dev-qa-db-ja.com

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

これまでのところ、このエラーはルート化された電話(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.です

ありがとう

94
cn123h

更新

この問題は、サポートライブラリ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の回避策

これが公式の方法で修正されるまで、 サポートライブラリの古いバージョンにこだわっている場合は、setImageIconメソッドのすべてのトレースが削除されるappcompat-v7の修正バージョンを作成しました。これは、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のみです。

警告:コピー&ペーストする前にコードを理解し、未知のソースからコードを取得するときは常に注意してください!

40
Eugen Pechanec

この問題は解決されました サポートライブラリ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に対してコンパイルする必要があることに注意してください。

14
Paul Lammertsma

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

25.3.1 versionを使用します。

交換

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'
1
phnmnn