support lib java android eclipse appcompat

java - lib - implementation com android support support v4 27.1 1



NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder (10)

Existe un problema con la biblioteca Android appcompat v7 en dispositivos Samsung con Android 4.2. Sigo recibiendo bloqueos con el siguiente seguimiento de pila en mi Developer Console:

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 bloqueos provienen de una variedad de dispositivos, pero siempre Samsung, y siempre Android 4.2.

Una búsqueda rápida en la web me lleva a pensar que muchas personas tienen el mismo problema. Algunos de los pasos que he intentado resolver son:

  • Compruebe las propiedades del proyecto de Android, asegúrese de que la biblioteca appcompat se haya agregado correctamente.
  • Verifique las propiedades del proyecto Java Build Path Order y Export project, asegúrese de que las dependencias de Android y las bibliotecas privadas de Android estén marcadas.
  • 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 para android.support.v7.appcompat.
  • Confirme que el tema AppCompat esté incluido en la actividad Manifest.xml.
  • Limpiar y reconstruir el proyecto.

A pesar de estos pasos, ya pesar de que funciona en todos los demás dispositivos y versiones de Android, los informes de fallos todavía se publican.


¿En qué dispositivo estás enfrentando este problema? (Samsung / HTC etc.)

Si es Samsung,

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

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

Para solucionar esto, debe cambiar el nombre de esa clase. La forma más fácil de hacerlo es ejecutando proguard. Si no quiere ofuscarse, aquí hay un trazador de líneas 1 para cambiar el nombre de las clases infractoras:

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

Hay un problema para rastrear este problema, pero como se trata de un error de Samsung, nunca se arreglará. La única forma de solucionarlo en el lado de Google / AOSP es cambiar el nombre de estas clases internas.

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


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

El valor predeterminado es "Lollipop"

PASOS

  1. Haga clic con el botón derecho en su proyecto y seleccione Abrir configuración del módulo (o presione F4)
  2. En la pestaña de propiedades Versión compilada de Sdk

Como dijo # 150 de los grupos de google

Porque cuidado con -manejar clase! Android.support.v7.internal.view.menu. **. Hay una serie de clases que se referencian desde los recursos del appcompat.

La mejor solución es agregar las siguientes líneas en su lugar:

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



EDITAR:

La solución que funcionó para mí fue (usando 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 de google, # 138 .

Respuesta anterior (solución temporal): sucede en un proyecto en el que utilizo un spinner en ActionBar. Mi solución fue verificar 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ó, esta no es una solución definitiva, solo es una manera de permitir que los usuarios tengan acceso a funcionalidades limitadas mientras se encuentra una solución más permanente.


Estaba teniendo el mismo problema de esta clase de MenuBuilder que no se encuentra en el modo de depuración de USB. Resolví este problema simplemente configurando minifyEnabled en true en el bloque buildTypes tanto de versión como de depuración de build.gradle . Me gusta esto:

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

Establecí minifyEnabled en true en el tipo de depuración para evitar que la aplicación se bloquee mediante la depuración de USB en un teléfono en vivo.


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

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

Para que la respuesta sugerida anteriormente funcione de nuevo, 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 solución anterior:

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


Obtuve el mismo error al intentar ejecutar una aplicación ''Hello World'' en mi tableta Samsung Galaxy Tab 3 a través de Android Studio. La aplicación parece iniciarse y luego se bloqueará al instante y ese error se mostraría en la consola en Android Studio. Hice una actualización del sistema en la tableta y ahora puedo ejecutar la aplicación ''Hello World'' y ya no recibo el error. 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.


Permití proguard con las propiedades de protección predeterminadas provistas con un proyecto de eclipse y el problema se solucionó para mí. Según algunos comentarios aquí https://code.google.com/p/android/issues/detail?id=78377 , algunas personas podrían tener que volver a empaquetar usando: -repackageclasses "android.support.v7"


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