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

95

Jak dotąd ten błąd wystąpił tylko dla jednego użytkownika, który korzysta z telefonu zrootowanego (SM-G900R7 Android 4.4.2). Błąd wygląda tak:

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)

Nigdy nie używam android.graphics.drawable.Icon w moim kodzie, wszystkie zastosowania pochodzą z android.support.v4.graphics.drawable.IconCompati nigdy nie używam tej klasy w moim kodzie ...

Przy okazji moja biblioteka wsparcia to version 26.0.0, my minSdkVersion is 15 targetSdkVersion is 26.

Dzięki

cn123h
źródło
4
Dla mnie ten sam problem. To samo zrootowane urządzenie, ta sama wersja Androida. Znalazłeś rozwiązanie?
Chris
24
Niech zgadnę? Urządzenia Samsung z systemem Android 4?
Noman Rafique,
7
@NomanRafique Samsung S5, 4.4.2, zakorzeniony.
Vaiden
2
Doświadczam tego samego, tego samego urządzenia zgłoszonego przez crashlyitcs. Jedna instancja prawie każdej nowej wersji i prawie natychmiast po opublikowaniu. Moja aplikacja ma multidex.
djxstream,
6
google issue tracker: issuetracker.google.com/issues/63151548
tabjsina

Odpowiedzi:

40

Aktualizacja

Problem został rozwiązany w bibliotece wsparcia 27.0.0. Jeśli zaktualizujesz, nie zapomnij również o zmianie compileSdkVersion 27.

Co się dzieje?

Urządzenia Samsung z Androidem 4.4 Viewulegają awarii w ten sposób, gdy klasy rozszerzające definiują metody, które zwracają lub przyjmują parametry typów, które nie znajdują się w ścieżce klas.

Począwszy od wersji 25.4.0 obsługi biblioteki AppCompatImageViewi AppCompatImageButtonniepoprawnie zastępuje setImageIcon(Icon)metodę. Ponieważ Iconklasa została wprowadzona w API 23, aplikacja ulega awarii na urządzeniach Samsung z API 19.

Podobnie dzieje się, gdy próbujesz przesłonić View.onApplyWindowInsets(WindowInsets).

Obejście problemu dla biblioteki obsługi 26.1.0

Dopóki nie zostanie to naprawione w oficjalny sposób, jeśli utkniesz ze starszą wersją biblioteki wsparcia, stworzyłem zmodyfikowaną wersję, w appcompat-v7której wszystkie ślady setImageIconmetod są usuwane. Oznacza to, że nie ulegnie awarii na Samsungu z Androidem 4.4.

Umieść to na dole pliku build.gradle swojej aplikacji:

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'
        }
    }
}

Ten kod zastąpi appcompat-v7zależność opisanym zmodyfikowanym artefaktem.

Obecnie jedyną obsługiwaną wersją poprawki jest 26.1.0.

Ostrzeżenie: zapoznaj się z kodem przed skopiowaniem i wklejeniem i zawsze zachowaj ostrożność podczas pobierania kodu z nieznanych źródeł!

Eugen Pechanec
źródło
co się stanie w przyszłości, jeśli będę musiał zaktualizować bibliotekę obsługi do> 26.1.0? Myślę, że twoja poprawka będzie przestarzała, prawda?
Dika
2
@Dika Nie martw się, powinno to zostać naprawione w następnym wydaniu.
Eugen Pechanec,
1
@Chisko Nie używaj wielu wersji różnych bibliotek wsparcia. Myślę, że możesz bezpiecznie zaktualizować wszystkie biblioteki obsługi do 26.1.0. Poprawka została wydana tylko dla tej jednej wersji.
Eugen Pechanec
1
@Chisko to po prostu siła przyzwyczajenia. Wiele osób nie wie, że biblioteki obsługi są ze sobą połączone i mogą ulec awarii, jeśli używane są różne wersje. Tylko się upewniam :)
Eugen Pechanec,
1
@Alex Właśnie przejrzałem źródło AppCompat 27.0.0 i jest poprawne. Dwie opcje: 1) W jakiś sposób nadal używasz starszej biblioteki wsparcia. Sprawdź rozwiązane zależności. 2) Ten sam wyjątek został zgłoszony w innym miejscu iz powodu innej klasy. Czy możesz udostępnić raport o awarii lub ślad stosu? Przyjrzę się temu.
Eugen Pechanec
14

Ten problem został rozwiązany w bibliotece wsparcia 27.0.0:

Wtyczka Android Gradle 3.x:

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

Wtyczka Android Gradle 2.x:

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

Pamiętaj, że będziesz musiał również skompilować się z SDK na poziomie 27.

Paul Lammertsma
źródło
1

Ta awaria dotyczy wersji 25.4.0 biblioteki obsługi.

Użyj wersji 25.3.1 .

Zastąpić

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

Z:

compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:support-v4:25.3.1'
phnmnn
źródło
Warto zauważyć, że to blokuje compileSdkVersion 25, brak interfejsów API Android O i brak funkcji biblioteki wsparcia wprowadzonych od 25.4.0 (np. Przyciemnianie elementów rysunkowych widoku obrazu i backport morfowania ścieżki wektorowej). Oto biblioteka pomocy technicznej changelog developer.android.com/topic/libraries/support-library/ ...
Eugen Pechanec
-1

Istnieją 2 opcje:

  1. Czy zmieniłeś wersję biblioteki wsparcia? jest to dość klasyczny problem biblioteki, gdy zasoby czasami nie są „zapisywane” pod tą samą nazwą lub w ogóle. To nie ty, to google. Spróbuj użyć wsparcia lib 25 i sprawdź, czy ten błąd nadal występuje.
  2. Spróbuj wyczyścić projekt i odbudować. Może trzymasz jakieś stare wersje biblioteki w folderze kompilacji, a kiedy budujesz swój projekt, pobiera z niego stare wartości.
Dus
źródło
1
dziękuję za odpowiedź, za 2. Zrobiłem pełne gradle wiele razy. dla 1. moja targetSdkVersion to 26, Android Studio wyświetla ostrzeżenie, jeśli nie jest przeznaczony na najnowszy interfejs API, a Android Studio pokazuje również błąd, jeśli używam starszej wersji obsługi lib niż targetSdkVersion.
cn123h
1
Ten sam problem po aktualizacji do SDK 26.
amouly
@ cn123h Której wersji biblioteki obsługi używasz?
Sufian,
@amouly, a Twoja wersja biblioteki pomocy to?
Sufian,