it-swarm.com.de

NoClassDefFoundError: Android.support.v7.internal.view.menu.MenuBuilder

Es gibt ein Problem mit der Android appcompat v7-Bibliothek auf Samsung-Geräten, auf denen Android= 4.2 ausgeführt wird. Ich erhalte weiterhin Abstürze mit dem folgenden Stack-Trace in meiner Entwicklerkonsole:

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)

Dies ist Zeile 215 von CustomActivity.Java:

PopupMenu popup = new PopupMenu(CustomActivity.this, mImageViewMenu);

Die Abstürze kommen von einer Reihe von Geräten, aber immer Samsung und immer Android 4.2.

Eine schnelle Websuche lässt mich glauben, dass viele Menschen das gleiche Problem haben. Einige der Schritte, die ich versucht habe, das Problem zu lösen, sind:

  • Überprüfen Sie die Projekteigenschaften von Android, stellen Sie sicher, dass die AppCompat-Bibliothek ordnungsgemäß hinzugefügt wurde.
  • Überprüfen Sie die Eigenschaften Java Build Path Order und Export project, stellen Sie sicher, Android Dependencies und Android Private Libraries ist aktiviert.
  • Stellen Sie sicher, dass die Klasse in der Bibliothek enthalten ist (Android.support.v7.internal.view.menu.MenuBuilder).
  • Bestätigen Sie, dass sich R.Java im Verzeichnis gen für Android.support.v7.appcompat befindet.
  • Stellen Sie sicher, dass das AppCompat-Design in der Aktivität Manifest.xml enthalten ist.
  • Projekt bereinigen und neu erstellen.

Trotz dieser Schritte und obwohl es auf allen anderen Geräten und Android Versionen funktioniert, kommen die Absturzberichte immer noch durch.

170
Matt K

BEARBEITEN:

Die Lösung, die für mich funktionierte, war (mit Proguard), um dies zu ersetzen:

-keep class Android.support.v4.** { *; } 
-keep interface Android.support.v4.** { *; }

-keep class Android.support.v7.** { *; }
-keep interface Android.support.v7.** { *; }

mit diesem:

# Allow obfuscation of Android.support.v7.internal.view.menu.**
# to avoid problem on Samsung 4.2.2 devices with appcompat v21
# see https://code.google.com/p/Android/issues/detail?id=78377
-keep class !Android.support.v7.internal.view.menu.**,Android.support.** {*;}

Das Guthaben geht an die Google-Gruppe, # 138 .

Alte Antwort (vorübergehende Problemumgehung): Es passiert in einem Projekt, in dem ich eine spinner in der Aktionsleiste. Meine Lösung bestand darin, nach diesen Bedingungen zu suchen und den App-Flow zu ändern:

public static boolean isSamsung_4_2_2() {
    String deviceMan = Build.MANUFACTURER;
    String deviceRel = Build.VERSION.RELEASE;
    return "samsung".equalsIgnoreCase(deviceMan) && deviceRel.startsWith("4.2.2");
}

Dann in der Methode onCreate der Aktivität:

if (isSamsung_4_2_2()) {
    setContentView(R.layout.activity_main_no_toolbar);
} else {
    setContentView(R.layout.activity_main);
}

Wie bereits erwähnt, handelt es sich hierbei nicht um eine endgültige Lösung. Es handelt sich lediglich um eine Möglichkeit, Benutzern den Zugriff auf eingeschränkte Funktionen zu ermöglichen, während eine dauerhaftere Lösung gefunden wird.

100
unify

Wie # 150 von Google Groups gesagt

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.** { *; }
-keep interface Android.support.v7.** { *; }
26
Pongpat

Auf welchem ​​Gerät tritt dieses Problem auf? (Samsung/HTC usw.)

Wenn es Samsung ist,

Verschiedene Samsung-Telefone sind in älteren Versionen der Android) Support-Bibliothek im Framework oder Klassenpfad enthalten. Wenn Sie die neue Material-Support-Bibliothek verwenden, wird dieser Absturz auf diesen Samsung-Geräten angezeigt:

Java.lang.NoClassDefFoundError: Android.support.v7.internal.view.menu.MenuBuilder

Um dies zu beheben, müssen Sie diese Klasse umbenennen. Am einfachsten geht das, indem Sie proguard ausführen. Wenn Sie nicht verschleiern möchten, können Sie mit dem folgenden 1-Zeilen-Code nur die anstößigen Klassen umbenennen:

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

Es gibt ein Problem, das dieses Problem aufspürt, aber da es sich wirklich um einen Samsung-Fehler handelt, wird es nie behoben. Die einzige Möglichkeit, dies auf der Google/AOSP-Seite zu beheben, besteht darin, diese internen Klassen umzubenennen.

https://code.google.com/p/Android/issues/detail?id=78377

23

Diese Ausgabe wurde in AppCompat 23.1.1 bei dem die .internal Paket wurde aus der Bibliothek entfernt.

Wie in den obigen Kommentaren angedeutet (Dank an die Leute, die es dort vorgeschlagen haben), muss nun auch die Proguard-Konfiguration geändert werden.

Versuchen Sie, die folgenden Zeilen zu Ihren Proguard-Dateien hinzuzufügen, damit die oben vorgeschlagene Antwort wieder funktioniert:

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

Anstelle des alten Updates:

#FOR OLDER APPCOMPAT VERSION:
-keep class !Android.support.v7.internal.view.menu.*MenuBuilder, Android.support.v7.** { ; }
-keep interface Android.support.v7.* { *; }
15
RWIL

Nach den letzten Beiträgen des Bugreports sollte dies in der neuen Version der Support-Bibliothek (24.0.0) behoben sein: https://code.google.com/p/Android/issues/detail) ? id = 78377 # c374

Jemand behauptete sogar es hat es repariert.

Diese Version ist verfügbar seit letztem Monat , daher sollten Sie darauf aktualisieren.

12

Ich hatte das gleiche Problem mit dieser MenuBuilder-Klasse, das im USB-Debugging-Modus nicht gefunden wurde. Ich habe dieses Problem durch einfaches Setzen von minifyEnabled auf true in release und debug buildTypes Block von build.gradle gelöst . so was:

buildTypes {

    debug {

        minifyEnabled true
    }

    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
    }
}

Ich habe minifyEnabled in debug auf true gesetzt, um zu verhindern, dass die App beim USB-Debugging auf ein Live-Mobilteil abstürzt.

4
FAQi

Ja. Samsung weiß bereits über dieses Problem. Ich kann vorschlagen, dass Sie versuchen, dieselbe Implementierung von Popup von GitHub zu verwenden. Es ist nicht der beste Weg, aber es wird funktionieren.

4
Eldar Miensutov

Ich habe Proguard mit den Standard-Proguard-Eigenschaften aktiviert, die mit einem Eclipse-Projekt bereitgestellt wurden, und das Problem wurde für mich behoben. Basierend auf einigen Kommentaren hier https://code.google.com/p/Android/issues/detail?id=78377 , müssen einige Leute möglicherweise das Paket mit -repackageclasses "Android.support.v7" neu packen "

0
u2tall

Ich habe den gleichen Fehler erhalten, als ich über Android Studio) versucht habe, eine 'Hello World'-App auf meinem Samsung Galaxy Tab 3-Tablet auszuführen. Die App wird anscheinend gestartet und stürzt sofort ab, und dieser Fehler tritt auf würde in der Konsole in Android Studio angezeigt. Ich habe ein Systemupdate auf dem Tablet durchgeführt und jetzt kann ich die 'Hello World'-App ausführen und bekomme den Fehler nicht mehr. I hoffe, das hilft jemandem, ihr Problem zu lösen.

Hinweis: Die Systemaktualisierung, die ich auf dem Tablet durchgeführt habe, hat die Android Betriebssystemversion nicht aktualisiert, da immer noch angegeben wird, dass die Version 4.2.2 ist.

0
JulianDavid