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

79

Wir haben gerade unsere Anwendung geändert, um die appcompat-v7 supportBibliothek zu verwenden, um die Support-Aktionsleiste und die Support-Material-Themen zu nutzen. Mit v21.0.0 of appcompat-v7(und v21.0.0 of support-v4), wir sehen jetzt Abstürze in Google Playund 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 theActionbar` wird angezeigt und / oder ungültig gemacht.

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 unter v4.2.2 weisen dieses Verhalten nicht auf. Nach meinem Verständnis verwenden viele Google Apps bereits diese neue Version von appcompat, um die Aktionsleiste anzuzeigen. Wenn diese Apps keine Abstürze auf diesen Geräten melden, ist es hilfreich zu wissen, wie dies vermieden / behoben wird.

Ich habe dies als Fehler bei Google gemeldet, aber es wurde mit dem Grund geschlossen, dass es sich um ein Entwicklungsproblem handelt. Obwohl ich damit einverstanden bin, dass dies der Fall sein kann, frage ich mich, ob / wie jemand derzeit in der Lage ist, zu verwenden appcompat-v7 v21.0.0und keine Abstürze zu bekommen Samsung 4.2.2 devices.

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

Erik Pedersen
quelle
Dies mag ein verwandtes Problem sein, aber es scheint eine etwas andere Ausnahme zu sein. Eine kürzlich in der anderen Frage veröffentlichte Lösung bezieht sich auf einen Spinner in der Aktionsleiste, und ich habe diese Situation nicht. Ich benutze nur Menüpunkte.
Erik Pedersen
Ich habe auch dieses Problem. App ist in Produktion und empfängt Abstürze von Samsung mit 4.2.2. Geräte
Martin Vandzura
1
Ich habe auch keinen Spinner in meiner Aktionsleiste und erhalte diesen von Nicht-Samsung-Geräten mit Android 4.2.2: Qmobile I9 und Wiko (unbekanntes Modell).
Jürgen 'Kashban' Wahlmann
1
@ Devashish: Die Proguard-Lösung in der zweiten Antwort hat bei mir funktioniert. Ich habe gegen ein von appthwack.com betroffenes Samsung-Gerät getestet und nach dem Anwenden der Proguard-Konfiguration wurden keine Fehler mehr angezeigt.
Jürgen 'Kashban' Wahlmann

Antworten:

15

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

Durch die Nutzung

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

anstatt

-keep class android.support.v7.** {*;}
robUx4
quelle
1
Ich denke, Sie können mehr Platz sparen, indem Sie "-keepnames" anstelle von "-keep" verwenden.
Justin
Wie in der Diskussion unter code.google.com/p/android/issues/detail?id=78377 erwähnt , kann die Verwendung dieser speziellen Lösung aufgrund von Ressourcenreferenzen in der Appcompat-Bibliothek zu Problemen führen. Dies hat jedoch für unsere spezielle App funktioniert, daher markiere ich diese Antwort als akzeptiert.
Erik Pedersen
Wo soll ich diese Zeile schreiben?
Bugs passieren
@BugsHappen, dies würde in Ihre Gradle-Build-Datei aufgenommen. Sie können mehr über ProGuard hier lesen: developer.android.com/tools/help/proguard.html
Dick Lucas
7

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 des Appcompat verwiesen wird.

Die bessere Lösung besteht darin, 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.** { *; }
Pongpat
quelle
In meinen Tests, basierend auf einer Überprüfung der generierten Proguard-Zuordnungsdatei, führt diese vorgeschlagene Proguard-Konfiguration nicht zu einer Verschleierung des MenuBuilder-Klassennamens, obwohl SubMenuBuilder
Andy Dennie am
Herausgefunden; siehe meine Antwort.
Andy Dennie
Hey Andy, ich habe das gleiche Problem. MenuBuilder ist nicht verschleiert, aber andere, sagen Sie mir, wie Sie es gelöst haben. danke
Qing
6

Da Appcompat 23.1.1das .internalPaket im AppCompat-Jar entfernt wurde.

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.* { *; }
RWIL
quelle
1

Wenn jemand Interesse an einer Lösung ohne Progaurd hat.

Lesen Sie den Link, den ich in einer meiner Apps ausprobiert habe, die die Ausnahme für setSupportActionBar (Symbolleiste) in onCreate () gab.

Es ist ziemlich einfach, einfach einen try catch-Block um den Anruf herum hinzuzufügen

try {

 setSupportActionBar(toolbar);

} catch (Throwable t) {

 // WTF SAMSUNG!

}
Ravi
quelle
0

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

Ikechukwu Kalu
quelle
-2

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

Der Standardwert ist "Lollipop".

Bisher hat es mein Problem auf Qmobile i9 gelöst

SCHRITTE

  1. Klicken Sie mit der rechten Maustaste auf Ihr Projekt und wählen Sie Moduleinstellungen öffnen (oder drücken Sie F4).
  2. Auf der Registerkarte Eigenschaften Kompilierte Sdk-Version
Jazib Hasan
quelle
-3

Ersetzen Sie AppCompatActivity durch Activity

Das hat mir geholfen.

Sachin Waghmare
quelle
Günstige Lösung. Möglicherweise verwendet er AppCompat, weil er API <11 oder ähnliches unterstützen möchte. Dies wird diese Idee brechen.
Sufian
Ich denke, es ist vielleicht schlimm genug, um herabgestimmt zu werden, wenn jemand dem von Sufian genannten Grund zustimmt. Aber nicht so schlimm, gelöscht zu werden.
Gangnus
-3

Ersetzen

public class class_name extends AppCompatActivity
{

.........

}

Mit

public class class_name extends Activity
{

.........

}

Das hat mir geholfen.

Sachin Waghmare
quelle
Bitte hören Sie auf, Ihre Antworten auf dieselbe Frage zu duplizieren.
Sufian