77

Wir haben unsere Anwendung geändert, um die appcompat-v7 support-Bibliothek zu verwenden, um die Unterstützungs-Aktionsleiste zu nutzen und Materialthemen zu unterstützen. Mit v21.0.0 of appcompat-v7 (und v21.0.0 of support-v4) sind wir jetzt Abstürze in Google Play und Crashlytics sehen nur von Samsung-Geräten running Android v4.2.2 . Here is the stack trace from Google Play and the app appears to crash as soon as the actionbar` gezeigt und/oder für ungültig erklärt.appcompat-v7 v21.0.0 verursacht Absturz auf Samsung-Geräten mit Android v4.2.2

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 laufen v4.2.2 tun Dieses Verhalten wird von mir nicht erkannt Es ist klar, dass viele Google-Apps diese neue Version von appcompat bereits verwenden, um die Aktionsleiste anzuzeigen Wenn diese Apps keine Abstürze auf diesen Geräten melden, wäre es hilfreich zu wissen, wie dies verhindert wird

Ich habe dies als ein Fehler zu Google aber es gemeldet wurde geschlossen, weil es ein Entwicklungsproblem ist. Obwohl ich dem zustimmen kann, frage ich mich, ob und wie jemand derzeit appcompat-v7 v21.0.0 verwenden kann und keine Abstürze auf Samsung 4.2.2 devices bekommen.

Update: Es sieht so aus, als ob Google zumindest mögliche Problemumgehungen dafür in Betracht zieht. Details finden Sie unter this.

+0

mögliche Duplikate von [NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder] (http://stackoverflow.com/questions/24809580/noclassdeffounderror-android-support-v7-internal-view-menu- menubuilder) – Nachi

+0

Dies kann ein verwandtes Problem sein, aber es scheint eine etwas andere Ausnahme zu sein. Eine neue Lösung, die in der anderen Frage gepostet wurde, bezieht sich auf einen Spinner in der Aktionsleiste und ich habe diese Situation nicht. Ich benutze nur Menüpunkte. –

+0

Ich habe dieses Problem auch. App ist in Produktion und erhält Abstürze von Samsung mit 4.2.2. Geräte – vandzi

Antwort

15

fand ich die richtige Lösung hier: https://stackoverflow.com/a/26641388/1266123

Durch die Verwendung von

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

statt

-keep class android.support.v7.** {*;} 
+0

Ich denke, Sie können mehr Speicherplatz sparen, indem Sie "-keepnames" anstelle von "-keep" verwenden. – Justin

+0

Wie in der Diskussion von https://code.google.com/p/android/issues/detail erwähnt?id = 78377, kann die Verwendung dieser speziellen Lösung zu Problemen aufgrund von Ressourcenreferenzen innerhalb der appcompat-Bibliothek führen. Dies hat jedoch für unsere spezielle App funktioniert, so dass ich diese Antwort als akzeptiert markieren. –

+0

Wo soll ich diese Zeile schreiben? –

7

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

Because careful with -keep class !android.support.v7.internal.view.menu.**. There are a number of classes in there which are referenced from the appcompat's resources.

Die bessere Lösung ist es, die folgenden Zeilen hinzufü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.** { *; } 
+0

In meinen Tests, basierend auf einer Überprüfung der generierten Progard-Mapping-Datei, führt diese vorgeschlagene Proguard-Konfiguration nicht zur Verschleierung der Name der MenuBuilder-Klasse, obwohl SubMenuBuilder –

+0

verschleiert wird. Sieh meine Antwort. –

+0

Hey Andy ich habe das gleiche Problem, MenuBuilder ist nicht verschleiert, aber andere sind, Verstand, mir zu sagen, wie Sie es gelöst haben? Danke – Qing

1

Wenn jemand daran interessiert, eine Lösung ohne progaurd verwenden.

Lesen Sie die link Ich habe dies in einer meiner Anwendungen ausprobiert, die die Ausnahme auf setSupportActionBar (Symbolleiste) in onCreate() gab.

Es ist ziemlich einfach fügen Sie einfach try catch-Block um den Anruf

try { 

setSupportActionBar(toolbar); 

} catch (Throwable t) { 

// WTF SAMSUNG! 

} 
+6

"WTF SAMSUNG!", musste lachen ... –

-2

Ändern Sie die Compile Sdk Version Ihres Projekts "API 18: (JellyBean)"

Die Standardeinstellung ist auf "Lollipop"

Bisher löste es mein Problem auf QMobile i9

SCHRITTE

  1. Rechts auf Ihr Projekt Klicken und Open-Modul-Einstellungen auswählen (oder drücken Sie F4)
  2. Im Register Eigenschaften Zusammengestellt Sdk Version
-2

AppCompatActivity ersetzen Mit Aktivität

Das hat mir geholfen. Ersetzen

+0

Billige Lösung. Er verwendet möglicherweise AppCompat, weil er API <11 oder etwas unterstützen möchte. Dies wird diese Idee brechen. – Sufian

+0

Ich denke, es ist vielleicht schlimm genug, um downvoted zu werden, wenn jemand mit dem von Sufian genannten Grund einverstanden ist. Aber nicht so schlecht gelöscht zu werden. – Gangnus

-2

public class class_name extends AppCompatActivity 
{ 

......... 

} 

Mit

public class class_name extends Activity 
{ 

......... 

} 

Das half mir.

+0

Bitte beenden Sie die Duplizierung Ihrer Antworten zu dieser Frage. – Sufian

6

Seit Appcompat 23.1.1 wurde das .internal-Paket im AppCompat-Jar entfernt.

Aktualisiert fix mit proguard:

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

begegnete ich das gleiche Problem auf Tecno P9, aber nach Tools 24 und für meine Unterstützung Bibliothek bauen mit I 24.2.0 verwendet wurde behoben.