Właśnie zmieniliśmy naszą aplikację, aby korzystała z appcompat-v7 support
biblioteki, aby skorzystać z paska akcji wsparcia i obsługiwać motywy Material. Używając v21.0.0 of appcompat-v7
(i v21.0.0 of support-v4)
, teraz widzimy awarie w Google Play
i Crashlytics tylko z urządzeń Samsung running
Android v4.2.2 . Here is the stack trace from Google Play and the app appears to crash as soon as the
actionbar) jest wyświetlany i / lub unieważniany.
java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder
at android.support.v7.app.ActionBarActivityDelegateBase.initializePanelMenu(ActionBarActivityDelegateBase.java:991)
at android.support.v7.app.ActionBarActivityDelegateBase.preparePanel(ActionBarActivityDelegateBase.java:1041)
at android.support.v7.app.ActionBarActivityDelegateBase.doInvalidatePanelMenu(ActionBarActivityDelegateBase.java:1259)
at android.support.v7.app.ActionBarActivityDelegateBase.access$100(ActionBarActivityDelegateBase.java:80)
at android.support.v7.app.ActionBarActivityDelegateBase$1.run(ActionBarActivityDelegateBase.java:116)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5299)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)
Inne urządzenia i emulatory działające w wersji 4.2.2 nie wykazują tego zachowania. Rozumiem, że wiele aplikacji Google używa już tej nowej wersji programu appcompat
do wyświetlania paska akcji. Jeśli te aplikacje nie zgłaszają awarii na tych urządzeniach, warto wiedzieć, w jaki sposób można tego uniknąć / naprawić.
Zgłosiłem to jako błąd do Google, ale został zamknięty z tego powodu, że jest to problem programistyczny. Chociaż zgadzam się, że może tak być, zastanawiam się, czy / jak ktokolwiek może obecnie używać appcompat-v7 v21.0.0
i nie ma awarii Samsung 4.2.2 devices
.
Aktualizacja: wygląda na to, że Google przynajmniej rozważa możliwe obejścia tego problemu. Zobacz to, aby uzyskać szczegółowe informacje.
źródło
Odpowiedzi:
Odpowiednie rozwiązanie znalazłem tutaj: https://stackoverflow.com/a/26641388/1266123
Używając
-keep class !android.support.v7.internal.view.menu.**,android.support.v7.** {*;}
zamiast
-keep class android.support.v7.** {*;}
źródło
Jak # 150 z https://code.google.com/p/android/issues/detail?id=78377 powiedział
Lepszym rozwiązaniem jest dodanie następujących linii:
-keep class !android.support.v7.internal.view.menu.MenuBuilder, !android.support.v7.internal.view.menu.SubMenuBuilder, android.support.v7.** { *; } -keep interface android.support.v7.** { *; }
źródło
Ponieważ
Appcompat 23.1.1
na.internal
opakowaniu w słoiku AppCompat został usunięty.Zaktualizowana poprawka za pomocą proguard:
#FOR APPCOMPAT 23.1.1: -keep class !android.support.v7.view.menu.*MenuBuilder*, android.support.v7.** { *; } -keep interface android.support.v7.* { *; }
źródło
Dla wszystkich, którzy mają ten problem, jak dotąd wydaje się, że jedynym obejściem jest użycie proguard. Dyskusja dotycząca usługi Checkout pod adresem https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&groupby=&sort=&id=78377
źródło
Jeśli ktoś jest zainteresowany użyciem rozwiązania bez progaurdu.
Przeczytaj link, który wypróbowałem w jednej z moich aplikacji, który dał wyjątek na setSupportActionBar (pasek narzędzi) w onCreate ().
Jest to całkiem proste, wystarczy dodać blok próbny catch wokół połączenia
try { setSupportActionBar(toolbar); } catch (Throwable t) { // WTF SAMSUNG! }
źródło
Napotkałem ten sam problem na Tecno P9, ale po użyciu narzędzi do kompilacji 24 i mojej biblioteki wsparcia użyłem 24.2.0, został naprawiony.
źródło
Zmień wersję kompilacji Sdk projektu na „API 18: (JellyBean)”
Wartość domyślna to „Lollipop”
Jak dotąd rozwiązałem mój problem na Qmobile i9
KROKI
źródło
Zastąp AppCompatActivity aktywnością
To mi pomogło.
źródło
Zastąpić
public class class_name extends AppCompatActivity { ......... }
Z
public class class_name extends Activity { ......... }
To mi pomogło.
źródło