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.

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 

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 .

  • ¿Cómo manejar los cambios de la superposición de volumen remota de MediaSession?
  • Recyclerview con el interior scrollview anidado?
  • Java.lang.illegalStateException se produce al azar al obtener mediaPlayer.getCurrentPosition
  • Manera correcta de obtener el objeto Realm por su clave principal en Android Java
  • Android cómo obtener diferencia de tiempo entre dos zonas horarias en Android?
  • Mejor vista para mostrar imágenes y contenido html en android
  • Regex palabra entera
  • ¿Cómo puedo hacer que el botón "Arriba" de mi ActionBar funcione como el botón "Atrás" del teléfono?
  • Cómo llamar a un método después de un retraso en Android
  • Jni llama al método java que toma una interfaz java personalizada como parámetro
  • ¿El aumento de tamaño de jittable se correlaciona con la pérdida de memoria en android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.