wake-up-neo.com

appcompat-v7 v21.0.0 führt auf Samsung-Geräten mit Android v4.2.2

Wir haben gerade unsere Anwendung geändert, um die Bibliothek appcompat-v7 support Zu verwenden, um die Support-Aktionsleiste und die Support-Material-Themen zu nutzen. Bei Verwendung von v21.0.0 of appcompat-v7 (Und v21.0.0 of support-v4) Sehen wir jetzt Abstürze in Google Play Und Crashlytics nur von Samsung-Geräten runningAndroid v4.2.2 . Here is the stack trace from Google Play and the app appears to crash as soon as the Actionbar` angezeigt und/oder ungültig gemacht wird.

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)

Andere Geräte und Emulatoren, auf denen Version 4.2.2 ausgeführt wird, weisen dieses Verhalten nicht auf. Nach meinem Verständnis verwenden bereits viele Google-Apps diese neue Version von appcompat, um die Aktionsleiste anzuzeigen. Wenn diese Apps auf diesen Geräten keine Abstürze melden, ist es hilfreich zu wissen, wie dies vermieden/behoben wird.

Ich habe dies Google als Fehler gemeldet, aber es wurde geschlossen, weil es sich um ein Entwicklungsproblem handelt. Obwohl ich dem zustimme, frage ich mich, ob/wie jemand derzeit appcompat-v7 v21.0.0 Verwenden kann und keine Abstürze bei Samsung 4.2.2 devices Verursacht.

Update: Es sieht so aus, als würde Google zumindest mögliche Problemumgehungen in Betracht ziehen. Siehe this für Details.

78
Erik Pedersen

Ich habe hier die richtige Lösung gefunden: https://stackoverflow.com/a/26641388/126612

Durch die Nutzung

-keep class !Android.support.v7.internal.view.menu.**,Android.support.v7.** {*;}

anstatt von

-keep class Android.support.v7.** {*;}
15
robUx4

Wie # 150 von https://code.google.com/p/Android/issues/detail?id=78377 sagte

Weil vorsichtig mit -keep class! Android.support.v7.internal.view.menu. **. Dort gibt es eine Reihe von Klassen, auf die aus den Ressourcen von appcompat verwiesen wird.

Die bessere Lösung ist, stattdessen die folgenden Zeilen hinzuzufügen:

-keep class !Android.support.v7.internal.view.menu.MenuBuilder, !Android.support.v7.internal.view.menu.SubMenuBuilder, Android.support.v7.** { *; }
-keep interface Android.support.v7.** { *; }
7
Pongpat

Schon seit Appcompat 23.1.1 das .internal -Paket in der AppCompat-JAR wurde entfernt.

Update mit Proguard aktualisiert:

#FOR APPCOMPAT 23.1.1:
-keep class !Android.support.v7.view.menu.*MenuBuilder*, Android.support.v7.** { *; }
-keep interface Android.support.v7.* { *; }
6
RWIL

Für alle, die dieses Problem haben, scheint bisher nur die Problemumgehung Proguard zu verwenden. Diskussion zur Kasse unter 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

2
vandzi

Wenn jemand an einer Lösung ohne Programm interessiert ist.

Lesen Sie die Link Ich habe dies in einer meiner Apps versucht, die die Ausnahme auf setSupportActionBar (Symbolleiste) in onCreate () gab.

Es ist ziemlich einfach, fügen Sie einfach try catch block um den Aufruf hinzu

try {

 setSupportActionBar(toolbar);

} catch (Throwable t) {

 // WTF SAMSUNG!

}
1
Ravi

Ich habe das gleiche Problem bei Tecno P9 festgestellt, aber nachdem ich Build-Tools 24 verwendet habe und für meine Support-Bibliothek 24.2.0 verwendet habe, wurde es behoben.

0
Ikechukwu Kalu