web-dev-qa-db-fra.com

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

Il y a un problème avec la bibliothèque Android appcompat v7 sur les appareils Samsung exécutant Android 4.2. Je continue à avoir des plantages avec la trace de pile suivante dans ma console de développeur:

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)

C'est la ligne 215 de CustomActivity.Java:

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

Les pannes proviennent d’un grand nombre de périphériques, mais toujours de Samsung et toujours de Android 4.2.

Une recherche rapide sur le Web m'amène à penser que de nombreuses personnes ont le même problème. Certaines des étapes que j'ai essayées pour résoudre le problème sont les suivantes:

  • Vérifiez les propriétés du projet Android et assurez-vous que la bibliothèque appcompat est ajoutée correctement.
  • Vérifiez les propriétés du projet Java Ordre de chemin de construction et d'exportation, assurez-vous que Android Dépendances et Android Bibliothèques privées sont cochées.
  • Confirmez que la classe est incluse dans la bibliothèque (Android.support.v7.internal.view.menu.MenuBuilder).
  • Vérifiez que R.Java se trouve dans le répertoire gen de Android.support.v7.appcompat.
  • Confirmez que le thème AppCompat est inclus dans l'activité Manifest.xml.
  • Nettoyer et reconstruire le projet.

Malgré ces étapes et malgré le fait qu'il fonctionne sur tous les autres appareils et versions Android, les rapports d'incidents sont toujours transmis.

170
Matt K

MODIFIER:

La solution qui a fonctionné pour moi était (Using Proguard) de remplacer ceci:

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

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

avec ça:

# 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.** {*;}

Le crédit va au groupe Google, # 138 .

Ancienne réponse (solution temporaire): Cela se produit dans un projet où j'utilise un filer dans le Barre d'action. Ma solution était de vérifier ces conditions et de modifier le flux de l'application:

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");
}

Ensuite, dans la méthode onCreate de l'activité:

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

Comme il a été souligné, il ne s’agit pas d’une solution définitive, c’est simplement un moyen de permettre aux utilisateurs d’avoir accès à des fonctionnalités limitées tout en trouvant une solution plus permanente.

100
unify

Comme # 150 de Google Groupes dit

Parce que prudent avec la classe -keep! Android.support.v7.internal.view.menu. **. Il y a un certain nombre de classes qui sont référencées à partir des ressources de appcompat.

La meilleure solution consiste à ajouter les lignes suivantes à la place:

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

Sur quel appareil vous faites face à ce problème? (Samsung/HTC etc.)

Si c'est Samsung,

Divers téléphones Samsung sont des versions plus anciennes incluses de la bibliothèque de support Android dans la structure ou le chemin de classe. Si vous utilisez la nouvelle bibliothèque de support de matériau, vous verrez cet incident sur ces appareils Samsung:

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

Pour résoudre ce problème, vous devez renommer cette classe. Le moyen le plus simple de le faire est d’exécuter proguard. Si vous ne voulez pas obscurcir, voici une doublure pour renommer uniquement les classes incriminées:

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

Un problème est lié au suivi de ce problème, mais comme il s’agit d’un bogue Samsung, il ne sera jamais réparé. Le seul moyen de résoudre ce problème du côté de Google/AOSP consiste à renommer ces classes internes.

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

23

Ce problème s'est produit dans AppCompat 23.1.1 où le package .internal a été supprimé du fichier jar de la bibliothèque.

Comme suggéré dans les commentaires ci-dessus (crédits aux personnes qui l'ont suggéré ici), la configuration de proguard doit également être modifiée.

Pour que la réponse suggérée ci-dessus fonctionne à nouveau, essayez d'ajouter ces lignes à vos fichiers proguard:

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

Au lieu de l'ancien correctif:

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

Selon les dernières publications du rapport de bogue, ceci devrait être corrigé sur la nouvelle version de la bibliothèque de support (24.0.0): https://code.google.com/p/Android/issues/detail ? id = 78377 # c374

Quelqu'un a même prétendu il l'a corrigé.

Cette version est disponible depuis le mois dernier , vous devez donc l'actualiser.

12
android developer

J'avais le même problème de cette classe MenuBuilder non trouvé en mode de débogage USB. J'ai résolu ce problème en définissant simplement le minifyEnabled à true à la fois dans les versions et le débogage buildTypes bloc de build.gradle . comme ça:

buildTypes {

    debug {

        minifyEnabled true
    }

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

Je règle le type minifyEnabled sur true dans le type débogage pour empêcher l'application de se bloquer par le débogage USB sur un combiné sous tension.

4
FAQi

Oui. Samsung est déjà au courant du problème this . Je peux vous suggérer d’essayer d’utiliser la même implémentation de Popup à partir de GitHub . Ce n'est pas la meilleure façon, mais ce sera des travaux.

4
Eldar Miensutov

J'ai activé proguard avec les propriétés par défaut fournies avec un projet Eclipse et le problème a été résolu pour moi. D'après certains commentaires ici https://code.google.com/p/Android/issues/detail?id=78377 , il se peut que certaines personnes doivent reconditionner à l'aide de: -repackageclasses "Android.support.v7 "

0
u2tall

J'ai eu la même erreur en essayant de lancer une application 'Hello World' sur ma tablette Samsung Galaxy Tab 3 via Android Studio. L'application semblerait se lancer, puis se bloquerait instantanément et cette erreur s'afficherait dans la console sous Android Studio. J'ai fait une mise à jour du système sur la tablette et je peux maintenant exécuter l'application "Hello World" et je ne reçois plus l'erreur. J'espère que cela aide quelqu'un à résoudre son problème.

Remarque: la mise à jour système que j'ai effectuée sur la tablette n'a pas mis à jour la version du système d'exploitation Android, car elle indique toujours qu'il s'agit de la version 4.2.2.

0
JulianDavid