Występuje problem z biblioteką Android appcompat v7 na urządzeniach Samsung z systemem Android 4.2. W mojej Konsoli programisty ciągle pojawiają się awarie z następującym śladem stosu:
java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder
at android.support.v7.widget.PopupMenu.<init>(PopupMenu.java:66)
at com.[my-package-name].CustomActivity$5.onClick(CustomActivity.java:215)
at android.view.View.performClick(View.java:4222)
at android.view.View$PerformClick.run(View.java:17620)
at android.os.Handler.handleCallback(Handler.java:800)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5391)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
To jest wiersz 215 pliku CustomActivity.java:
PopupMenu popup = new PopupMenu(CustomActivity.this, mImageViewMenu);
Awarie pochodzą z szeregu urządzeń, ale zawsze Samsung i zawsze Android 4.2.
Szybkie wyszukiwanie w Internecie prowadzi mnie do wniosku, że wiele osób ma ten sam problem, niektóre z kroków, które próbowałem rozwiązać, to:
- Sprawdź właściwości projektu Android, upewnij się, że biblioteka appcompat została poprawnie dodana.
- Sprawdź kolejność ścieżek budowania języka Java i właściwości eksportu projektu, upewnij się, że zaznaczone są zależności systemu Android i biblioteki prywatne systemu Android.
- Upewnij się, że klasa znajduje się w bibliotece (android.support.v7.internal.view.menu.MenuBuilder).
- Sprawdź, czy R.java znajduje się w katalogu gen dla android.support.v7.appcompat.
- Sprawdź, czy motyw AppCompat jest uwzględniony w działaniu Manifest.xml.
- Wyczyść i przebuduj projekt.
Pomimo tych kroków i pomimo tego, że działa na wszystkich innych urządzeniach i wersjach Androida, raporty o awariach wciąż przychodzą.
java
android
eclipse
android-appcompat
Matt K.
źródło
źródło
Odpowiedzi:
EDYTOWAĆ:
Rozwiązaniem, które działało dla mnie, było (Korzystanie z Proguard), aby zastąpić to:
z tym:
Kredyt trafia do grupy Google, nr 138 .
Stara odpowiedź (tymczasowe obejście): Dzieje się tak w projekcie, w którym używam
pokrętła wActionBar. Moim rozwiązaniem było sprawdzenie tych warunków i zmiana przepływu aplikacji:Następnie w metodzie onCreate działania:
Jak wskazano, nie jest to ostateczne rozwiązanie, jest to po prostu sposób, aby umożliwić użytkownikom dostęp do ograniczonej funkcjonalności, podczas gdy zostanie znalezione bardziej trwałe rozwiązanie.
źródło
java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.i
Jako nr 150 z grup google powiedział
Lepszym rozwiązaniem jest dodanie następujących linii:
źródło
-keep class !android.support.v7.internal.view.menu.* implements android.support.v4.internal.view.SupportMenu, android.support.v7.** {*;}
-keep class !android.support.v7.internal.view.menu.**,** {*;}
nie działało już z v23 z aplikacjami COMPAT .-keep class !android.support.v7.internal.view.menu.*MenuBuilder*, android.support.v7.** { *; } -keep interface android.support.v7.** { *; }
jako odpowiedź :)Na jakim urządzeniu masz do czynienia z tym problemem? (Samsung / HTC itp.)
Jeśli to Samsung,
Różne telefony Samsung są dołączone do starszych wersji biblioteki obsługi systemu Android w ramach lub ścieżce klas. Jeśli korzystasz z nowej biblioteki obsługi materiałów, zobaczysz tę awarię na tych urządzeniach Samsung:
Aby to naprawić, musisz zmienić nazwę tej klasy. Najłatwiej to zrobić, uruchamiając program proguard. Jeśli nie chcesz zaciemniać treści, oto 1 linijka do zmiany nazw tylko naruszających klas:
Występuje problem ze śledzeniem tego problemu, ale ponieważ jest to naprawdę błąd Samsunga, nigdy nie zostanie on naprawiony. Jedynym sposobem na naprawienie tego po stronie Google / AOSP jest zmiana nazw tych klas wewnętrznych.
https://code.google.com/p/android/issues/detail?id=78377
źródło
Ten problem powrócił
AppCompat 23.1.1
tam, gdzie.internal
pakiet został usunięty z biblioteki jar.Jak zasugerowano w komentarzach powyżej (podziękowania dla osób, które to zasugerowały), teraz również konfiguracja proguard musi się zmienić.
Aby odpowiedź sugerowana powyżej działała ponownie, spróbuj dodać te wiersze do plików proguard:
Zamiast starej poprawki:
źródło
!android.support.v7.view.menu.**
jest bezpieczniejszy dzięki innym klasom, takim jak SubMenuBuilderZgodnie z ostatnimi postami raportu o błędzie, powinno to zostać naprawione w nowej wersji biblioteki wsparcia (24.0.0): https://code.google.com/p/android/issues/detail?id=78377 # c374
Ktoś nawet twierdził , że to naprawił.
Ta wersja jest dostępna od zeszłego miesiąca , więc powinieneś ją zaktualizować.
źródło
Tak. Samsung już wie o tym problemie. Mogę zasugerować, abyś spróbował użyć tej samej implementacji Popup z GitHub . To nie jest najlepszy sposób, ale będzie działać.
źródło
Miałem ten sam problem z tą klasą MenuBuilder, która nie została znaleziona w trybie debugowania USB. Rozwiązałem ten problem, po prostu ustawiając minifyEnabled na wartość true zarówno w bloku buildTypes wydania, jak i debugowania build.gradle . lubię to:
Ustawić minifyEnabled true w debugowania typu, aby zapobiec awariom poprzez aplikację debugowania USB na żywo słuchawce.
źródło
Włączyłem proguard z domyślnymi właściwościami proguard dostarczonymi z projektem zaćmienia i problem został rozwiązany dla mnie. Opierając się na komentarzach tutaj https://code.google.com/p/android/issues/detail?id=78377 , niektóre osoby mogą być zmuszone do przepakowania za pomocą: -repackageclasses "android.support.v7"
źródło
Ten sam błąd wystąpił podczas próby uruchomienia aplikacji „Hello World” na moim tablecie Samsung Galaxy Tab 3 przez Android Studio. Wyglądało na to, że aplikacja uruchamia się, a następnie natychmiast ulegała awarii, a ten błąd był wyświetlany w konsoli w Android Studio. Zrobiłem aktualizację systemu na tablecie i teraz mogę uruchomić aplikację „Hello World” i już nie otrzymuję błędu. Mam nadzieję, że pomoże to komuś rozwiązać problem.
Uwaga: aktualizacja systemu, którą przeprowadziłem na tablecie, nie zaktualizowała wersji systemu operacyjnego Android, ponieważ nadal mówi, że jest to wersja 4.2.2.
źródło
Zmień wersję kompilacji Sdk projektu na „API 18: (JellyBean)”
Domyślnym ustawieniem jest „Lollipop
KROKI
źródło