Error de Android aleatoriamente java.lang.NoClassDefFoundError: com.facebook.internal.Utility
Estoy usando el último SDK de Android de Facebook y obteniendo ese error de docenas de usuarios en mi aplicación de control de fallos remota en mi último lanzamiento de apk. He buscado aquí para tal error, pero la mayoría de las respuestas son demasiado anticuadas para el último SDK FB, y en este caso hay dos circunstancias extrañas:
A) El error parece ocurrir al azar. No he podido reproducirlo en absoluto en ninguno de mis dispositivos.
- Inbox de Google como elemento de RecyclerView abrir animación
- Enviar cadena de teléfono Android a PC
- Eliminar ListView pie de página Click Listener
- Android Frame by Frame Problema de animación en elementos en un CursorAdapter
- Tamaño de la página RAM de Android?
B) No hubo cambios en la lógica FB en absoluto entre ese lanzamiento y el anterior, y en la versión anterior nunca he tenido tal error.
Puesto que no podía encontrar ninguna diferencia relevante en el código entre esas versiones, pensé que el problema era algo malo podría haber sucedido con las herramientas de Android, mientras que la generación de la última apk, pero dando el hecho de que muy apk es el que estoy usando y Han sido incapaces de reproducir el problema y, a pesar de que decenas o usuarios son afectados, cientos de personas que utilizan el mismo apk no lo son, descarté también esta hipótesis.
Cualquier idea sobre cómo resolver o simplemente depurar esta cosa son bienvenidos.
Más información que podría ser relevante:
- Todos los accidentes ocurrieron en Android 4.0.3 o versiones anteriores. El porcentaje más alto es de 2.3.6 con 48% de todos los accidentes.
-
Esa clase realmente se exporta en el APK . Lo he comprobado descomprimiendo el apk y usando dexdump para ver lo que hay dentro de classes.dex. No podía esperar otra cosa, ya que funciona perfectamente en todos mis dispositivos y si la clase no estuviera allí, no lo haría.
$ ~ / Android-sdks / build-tools / 21.1.1 / dexdump clases.dex | Grep 'com.facebook.internal.Utility $ 1' Descriptor de clase: 'Lcom / facebook / internal / Utility $ 1;' # 2: (en Lcom / facebook / internal / Utility $ 1;) # 1: (en Lcom / facebook / internal / Utility $ 1;) Lcom / facebook / internal / Utility $ 1;) # 0: (en Lcom / facebook / internal / Utility $ 1;) # 1: (en Lcom / facebook / internal / Utility $ 1; / Utilidad $ 1;) # 3: (en Lcom / facebook / internal / Utility $ 1;)
-
Parece fallar después de una invocación del método estático de una utilidad de loadAppSettingsAsync, que pasa a ser un método estático dentro de la misma clase . Por lo tanto, si la clase com.facebook.internal.Utility no existe o no se pudo cargar, ¿cómo es posible que com.facebook.internal.Utility.loadAppSettingsAsync se ejecute en primer lugar? Y si existe y se carga, ¿por qué NoClassDefFoundError lanzado en com.facebook.internal.Utility? Estoy tan perdido
Aquí la pila de menta splunk (antes conocido como bugsense), Acabo de cambiar el nombre de la aplicación. Lo retraté con el archivo de mapa proguard, pero parece que se perdió algunos números de línea de todos modos:
java.lang.NoClassDefFoundError: com.facebook.internal.Utility$1 at com.facebook.internal.Utility.void loadAppSettingsAsync(android.content.Context,java.lang.String)(Unknown Source) at com.facebook.Settings.void sdkInitialize(android.content.Context)(Unknown Source) at com.facebook.UiLifecycleHelper.<init>(Unknown Source) at net.iberdroid.androidgames.framework.impl.AndroidGame.void onCreate(android.os.Bundle)(Unknown Source) at com.marzoa.ruletafree.xmas2012.RuletaAfortunadaGame.void onCreate(android.os.Bundle)(Unknown Source) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1050) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1623) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675) at android.app.ActivityThread.access$1500(ActivityThread.java:121) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:130) at android.app.ActivityThread.main(ActivityThread.java:3770) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:670) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.ClassNotFoundException: com.facebook.internal.Utility$1 in loader dalvik.system.PathClassLoader[/data/app/com.marzoa.ruletafree.xmas2012-2.apk] at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240) at java.lang.ClassLoader.loadClass(ClassLoader.java:551) at java.lang.ClassLoader.loadClass(ClassLoader.java:511) ... 18 more
- Sincronizar la hora del sistema en 2 teléfonos
- Error InMobi al desactivar el modo de prueba
- Cómo girar un marcador en OSMDroid para Android?
- ¿Está bien usar la clase estática de "ayudante de base de datos"?
- Significado de android.content.UriMatcher
- Mostrar un RecyclerView en Fragmento
- Cómo pasar datos de la clase de hilo independiente a la actividad en Android
- Proyección posterior en Java con OpenCV
Como el NoClassDefFoundError se produce en loadAppSettingsAsync en una implementación anónima de AsyncTask parece ser el mismo problema como este NoClassDefFoundError – Android 2.3.X
Es un error en los servicios de Google Play. ( https://code.google.com/p/android/issues/detail?id=81083 )
Intente agregar el siguiente en su método Application#onCreate()
como se describe en la respuesta del problema mencionado.
try { Class.forName("android.os.AsyncTask"); } catch(Throwable ignore) { // ignored }
En primer lugar, asegúrese de que está revisando la clase correcta. De acuerdo con el mensaje de error, la clase "missing" es com.facebook.internal.loadAppSettingsAsync$1
. Tenga en cuenta el $1
!! Esto significa que estamos hablando de una clase interna anónima que se declara dentro de la Utility.loadAppSettingsAsync
.
En segundo lugar, java.lang.NoClassDefFoundError
puede tener una serie de causas:
-
La clase puede faltar.
-
La clase podría estar presente pero descargable por alguna razón.
-
La clase podría ser cargada, pero un intento previo de inicializarla … o alguna clase dependiente … ha fallado.
El último caso típicamente ocurre si un inicialización estática o un bloque de inicialización estática lanza una excepción no comprobada la primera vez que se ejecutó. (Por lo general, un mensaje de registro para esta excepción.) Una vez que la inicialización de clase ha fallado una vez, la clase está marcada como rota. Esto detiene la inicialización de la clase y de cualquier otra clase que dependa de ella .
- Adjuntar depurador al proceso de Android automáticamente en Android Studio
- Cómo obtener el nombre de la ciudad por latitud y longitud en android?