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


95

지금까지 루팅 된 전화 (SM-G900R7 Android 4.4.2)를 사용하는 한 명의 사용자에게만이 오류가 발생했습니다. 오류는 다음과 같습니다.

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에서도 해당 클래스를 사용하지 않습니다.

Btw 내 지원 라이브러리는 version 26.0.0, my minSdkVersion is 15 targetSdkVersion is 26.

감사


4
나에게도 같은 문제입니다. 동일한 루팅 된 기기, 동일한 Android 버전. 해결책을 찾았습니까?
Chris

24
어디 보자? Android 4를 실행하는 삼성 기기?
Noman Rafique

7
@NomanRafique Samsung S5, 4.4.2, 뿌리.
Vaiden

2
crashlyitcs를 통해보고 된 동일한 장치, 동일한 문제가 발생합니다. 거의 모든 새 버전 및 게시 직후에 하나의 인스턴스. 내 앱에 multidex가 있습니다.
djxstream

6
구글 이슈 트래커 : issuetracker.google.com/issues/63151548
tabjsina

답변:


40

최신 정보

이 문제는 지원 라이브러리 27.0.0에서 수정되었습니다. 업데이트하는 경우 compileSdkVersion 27에도 변경하는 것을 잊지 마십시오 .

무슨 일이야?

클래스 확장이 클래스 View경로에없는 유형의 매개 변수를 반환하거나 가져 오는 메서드를 정의 할 때 Android 4.4가 설치된 삼성 기기가 이와 같이 충돌 합니다.

지원 라이브러리 버전 25.4.0 시작 AppCompatImageViewAppCompatImageButton잘못 무시 setImageIcon(Icon)하는 방법. 이후Icon 클래스는 API 23에 도입 된 응용 프로그램은 API (19) 삼성 장치에 충돌합니다.

재정의하려고 할 때 비슷한 일이 발생합니다. View.onApplyWindowInsets(WindowInsets) .

지원 라이브러리 26.1.0에 대한 해결 방법

이것이 공식적인 방식으로 수정 될 때까지 이전 버전의 지원 라이브러리를 사용하는 appcompat-v7경우 모든 흔적을 수정 한 버전을 만들었습니다.setImageIcon 메서드의 이 제거 . 즉, Android 4.4를 사용하는 삼성에서 충돌하지 않습니다.

앱의 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 17.10.17

1
@Chisko 다른 지원 라이브러리의 여러 버전을 사용하지 마십시오. 모든 지원 라이브러리를 26.1.0으로 안전하게 업데이트 할 수 있다고 생각합니다. 수정은 해당 버전에 대해서만 릴리스됩니다.
Eugen Pechanec 17.10.25

1
@Chisko 그것은 단지 습관의 힘입니다. 많은 사람들이 지원 라이브러리가 상호 연결되어 있다는 것을 모르고 다른 버전을 사용하면 충돌 할 수 있습니다. :)
Eugen Pechanec 17

1
@Alex 방금 AppCompat 27.0.0의 소스를 살펴 봤는데 맞습니다. 두 가지 옵션 : 1) 어쨌든 이전 지원 라이브러리를 사용하고 있습니다. 해결 된 종속성을 확인하십시오. 2) 다른 클래스와 다른 클래스로 인해 동일한 예외가 발생합니다. 충돌 보고서 또는 스택 추적을 공유 할 수 있습니까? 조사하겠습니다.
Eugen Pechanec 17.11.

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 25Android O API가 없으며 25.4.0 이후에 도입 된 지원 라이브러리 기능도 없습니다 (예 : 이미지 뷰 드로어 블 착색 및 벡터 경로 모핑 백 포트). 여기에 지원 라이브러리 변경 로그의 developer.android.com/topic/libraries/support-library/...은
오이겐 Pechanec

-1

두 가지 옵션이 있습니다.

  1. 지원 라이브러리 버전을 변경 했습니까? 이것은 리소스가 동일한 이름으로 또는 전혀 '저장'되지 않는 경우 매우 고전적인 라이브러리 문제입니다. 당신이 아니라 구글입니다. 지원 lib 25를 사용하고이 오류가 계속 발생하는지 확인하십시오.
  2. 프로젝트를 청소하고 다시 빌드하십시오. 빌드 폴더에 일부 오래된 라이브러리 버전이 남아있을 수 있으며 프로젝트를 빌드 할 때 이전 값을 가져옵니다.

1
2에 대해 답변 해 주셔서 감사합니다. 저는 풀 gradle clear를 여러 번했습니다. 1. 내 targetSdkVersion이 26이고 Android Studio는 최신 API를 대상으로하지 않으면 경고를 표시하고 Android Studio는 targetSdkVersion보다 이전 버전의 지원 lib를 사용하는 경우 오류를 표시합니다.
cn123h

1
SDK 26으로 업데이트 한 후에도 동일한 문제가 발생했습니다.
amouly

@ cn123h 어떤 버전의 지원 라이브러리를 사용하고 있습니까?
Sufian

@amouly 및 지원 lib 버전은 무엇입니까?
Sufian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.