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

Hay un problema con la librería Android appcompat v7 en los dispositivos Samsung que ejecutan Android 4.2. Sigo recibiendo fallos con el seguimiento de pila siguiente en mi Consola de desarrollo:

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) 

Esta es la línea 215 de CustomActivity.java:

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

Los accidentes vienen de una gran variedad de dispositivos, pero siempre Samsung, y siempre Android 4.2.

Una rápida búsqueda en la web me lleva a creer que muchas personas tienen el mismo problema, algunos de los pasos que he tratado de resolver el problema son:

  • Compruebe las propiedades del proyecto de Android, asegúrese de que la biblioteca appcompat se añade correctamente.
  • Compruebe las propiedades del proyecto Java Build Path Order y Export, asegúrese de que las dependencias de Android y las bibliotecas privadas de Android estén activadas.
  • Confirme que la clase está incluida en la biblioteca (android.support.v7.internal.view.menu.MenuBuilder).
  • Confirme que R.java se encuentra en el directorio gen de android.support.v7.appcompat.
  • Confirme que el tema AppCompat se incluye en la actividad Manifest.xml.
  • Limpiar y reconstruir el proyecto.

A pesar de estos pasos, ya pesar de que el trabajo en todos los otros dispositivos y versiones de Android los informes de accidentes todavía vienen a través.

EDITAR:

La solución que funcionó para mí fue (usar Proguard) para reemplazar esto:

 -keep class android.support.v4.** { *; } -keep interface android.support.v4.** { *; } -keep class android.support.v7.** { *; } -keep interface android.support.v7.** { *; } 

con este:

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

El crédito va al grupo google, # 138 .

Respuesta antigua (Solución temporal): Sucede en un proyecto en el que utilizo un hilador en la barra de acción. Mi solución fue comprobar esas condiciones y cambiar el flujo de la aplicación:

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

Luego, en el método onCreate de la actividad:

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

Como se señaló esto no es una solución definitiva, es sólo una manera de permitir a los usuarios tener acceso a la funcionalidad limitada, mientras que una solución más permanente se encuentra.

Como # 150 de los grupos google dijo

¡Cuidado con la clase -weep! Android.support.v7.internal.view.menu. **. Hay un número de clases en que se hace referencia desde los recursos del appcompat.

La mejor solución es añadir las siguientes líneas:

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

¿En qué dispositivo se enfrenta este problema? (Samsung / HTC, etc.)

Si se trata de Samsung,

Varios teléfonos Samsung se incluyen versiones anteriores de la biblioteca de soporte de Android en el marco o classpath. Si utiliza la nueva biblioteca de soporte de materiales, verá este bloqueo en los dispositivos Samsung:

 java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder 

Para corregir esto, debe cambiar el nombre de esa clase. La manera más fácil de hacerlo es ejecutando proguard. Si no desea ofuscar, aquí hay un forro de 1 para cambiar el nombre de las clases ofensivas:

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

Hay un problema de seguimiento de este problema, pero ya que es realmente un error de Samsung, nunca va a conseguir fijado en su final. La única manera de arreglarlo en el lado de Google / AOSP es cambiar el nombre de estas clases internas.

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

Este problema se devolvió en AppCompat 23.1.1 donde se .internal paquete .internal del .internal de la biblioteca.

Como se sugiere en los comentarios anteriores (créditos a las personas que lo sugirieron allí), ahora también la configuración proguard tiene que cambiar.

Para obtener la respuesta sugerida anteriormente, vuelva a funcionar, intente agregar estas líneas a sus archivos proguard:

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

En lugar de la vieja solución:

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

De acuerdo con los últimos puestos del informe de errores, esto debería fijarse en la nueva versión de la biblioteca de soporte (24.0.0): https://code.google.com/p/android/issues/detail?id=78377 # C374

Alguien incluso afirmó que lo arregló.

Esta versión está disponible desde el mes pasado , por lo que debe actualizar a ella.

Sí. Samsung ya sabe de este problema. Puedo sugerir que intente usar la misma implementación de Popup desde GitHub . No es la mejor manera, pero será obras.

Yo estaba teniendo el mismo problema de esta clase MenuBuilder no se encuentra en el modo de depuración USB. He resuelto este problema simplemente estableciendo el minifyEnabled a true en ambos release y debug buildTypes bloque de build.gradle . Me gusta esto:

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

He establecido el minifyEnabled a true en el tipo de depuración para evitar que la aplicación se estrelle a través de la depuración USB a un teléfono en vivo.

He habilitado proguard con las propiedades proguard predeterminadas proporcionadas con un proyecto eclipse y el problema fue arreglado para mí. Sobre la base de algunos comentarios aquí https://code.google.com/p/android/issues/detail?id=78377 , algunas personas pueden tener que volver a empaquetar con: -repackageclasses "android.support.v7"

Tengo el mismo error al intentar ejecutar una aplicación de "Hello World" en mi tablet Samsung Galaxy Tab 3 a través de Android Studio. Parece que la aplicación se inicia y luego se bloquea de forma instantánea y ese error se mostrará en la consola en Android Studio. Hice una actualización del sistema en la tableta y ahora soy capaz de ejecutar la aplicación 'Hello World' y no estoy recibiendo el error más. Espero que esto ayude a alguien a resolver su problema.

Nota: La actualización del sistema que realicé en la tableta no actualizó la versión del sistema operativo Android, porque todavía dice que la versión es 4.2.2.

Cambie la versión Compile Sdk de su proyecto a "API 18: (JellyBean)"

El valor predeterminado es "Lollipop".

PASOS

  1. Haga clic derecho en su proyecto y seleccione Abrir configuración de módulo (o presione F4)
  2. En la ficha Propiedades Compiled Sdk Version
  • Android N Java 8 características (Jack compilador) y Kotlin interoperabilidad
  • Error de sintaxis: Insertar "}" para completar el bloque
  • Cómo analizar el análisis de json Usando GSON en android
  • Las extensiones de Android - SPAN_EXCLUSIVE_EXCLUSIVE no pueden tener una longitud cero
  • Cómo configurar gradle-2.2.1-all.zip manualmente
  • Dynamic Spinners - si se selecciona un elemento de un hilandero, ocúltalo de otros hiladores - Android
  • Botón Atrás en ActionBar en MainActivity
  • Una implementación insegura de la interfaz X509TrustManager de google
  • Cómo activar la ofuscación de ProGuard en Android Studio?
  • Llamada de la API de Last.fm desde la aplicación de Android
  • Loader no se inicia después de llamar a initLoader ()?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.