FlexJson ClassNotFound Exception en Android 4.4.4

Tengo un proyecto multidex para dispositivos Android. Yo uso Flexjson. Ya lo he probado con flexjson 3.3 y 2.x.

Funciona perfectamente bien con Android 5.x, pero se bloquea en Android 4.4.4.

Parece que la biblioteca de soporte de Dex no funciona propperly con versiones anteriores de Android, pero no puedo decir.

Aquí está mi stacktrace:

06-29 03:50:44.763 11884-11884/com.pigdroid.gameboard E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.pigdroid.gameboard, PID: 11884 flexjson.JSONException: [ layers.values ]: Could not load com.pigdroid.game.board.tile.model.IntTileLayer at flexjson.ObjectBinder.findClassInMap(ObjectBinder.java:250) at flexjson.ObjectBinder.findClassName(ObjectBinder.java:213) at flexjson.ObjectBinder.bind(ObjectBinder.java:92) at flexjson.ObjectBinder.bindIntoCollection(ObjectBinder.java:110) at flexjson.factories.ListObjectFactory.instantiate(ListObjectFactory.java:13) at flexjson.ObjectBinder.bind(ObjectBinder.java:95) at flexjson.ObjectBinder.bindIntoObject(ObjectBinder.java:149) at flexjson.factories.ExistingObjectFactory.instantiate(ExistingObjectFactory.java:25) at flexjson.ObjectBinder.bind(ObjectBinder.java:95) at flexjson.ObjectBinder.bind(ObjectBinder.java:74) at flexjson.JSONDeserializer.deserialize(JSONDeserializer.java:241) at flexjson.JSONDeserializer.deserializeInto(JSONDeserializer.java:301) at com.pigdroid.game.model.memento.UndoableObject.from(UndoableObject.java:35) at com.pigdroid.game.controller.GameController.loadModelFromSerialized(GameController.java:108) at com.pigdroid.gameboard.view.detail.game.tile.TileBoardGameFragmentController.setGame(TileBoardGameFragmentController.java:692) at com.pigdroid.gameboard.view.detail.game.GameDetailFragment.onKickOff(GameDetailFragment.java:168) at com.pigdroid.gameboard.view.ServiceFragment.kickOffIf(ServiceFragment.java:71) at com.pigdroid.gameboard.view.detail.game.GameDetailFragment.kickOffIf(GameDetailFragment.java:159) at com.pigdroid.gameboard.view.ServiceFragment$3.bound(ServiceFragment.java:52) at com.pigdroid.gameboard.view.ServiceFragment$3.bound(ServiceFragment.java:48) at com.pigdroid.android.hateaidl.HateAIDLConnection$3.onServiceConnected(HateAIDLConnection.java:118) at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1101) at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1118) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5001) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.ClassNotFoundException: Didn't find class "com.pigdroid.game.board.tile.model.IntTileLayer" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/system/lib]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) at java.lang.ClassLoader.loadClass(ClassLoader.java:497) at java.lang.ClassLoader.loadClass(ClassLoader.java:457) at android.app.LoadedApk$WarningContextClassLoader.loadClass(LoadedApk.java:430) at flexjson.ObjectBinder.findClassInMap(ObjectBinder.java:243)             at flexjson.ObjectBinder.findClassName(ObjectBinder.java:213)             at flexjson.ObjectBinder.bind(ObjectBinder.java:92)             at flexjson.ObjectBinder.bindIntoCollection(ObjectBinder.java:110)             at flexjson.factories.ListObjectFactory.instantiate(ListObjectFactory.java:13)             at flexjson.ObjectBinder.bind(ObjectBinder.java:95)             at flexjson.ObjectBinder.bindIntoObject(ObjectBinder.java:149)             at flexjson.factories.ExistingObjectFactory.instantiate(ExistingObjectFactory.java:25)             at flexjson.ObjectBinder.bind(ObjectBinder.java:95)             at flexjson.ObjectBinder.bind(ObjectBinder.java:74)             at flexjson.JSONDeserializer.deserialize(JSONDeserializer.java:241)             at flexjson.JSONDeserializer.deserializeInto(JSONDeserializer.java:301)             at com.pigdroid.game.model.memento.UndoableObject.from(UndoableObject.java:35)             at com.pigdroid.game.controller.GameController.loadModelFromSerialized(GameController.java:108)             at com.pigdroid.gameboard.view.detail.game.tile.TileBoardGameFragmentController.setGame(TileBoardGameFragmentController.java:692)             at com.pigdroid.gameboard.view.detail.game.GameDetailFragment.onKickOff(GameDetailFragment.java:168)             at com.pigdroid.gameboard.view.ServiceFragment.kickOffIf(ServiceFragment.java:71)             at com.pigdroid.gameboard.view.detail.game.GameDetailFragment.kickOffIf(GameDetailFragment.java:159)             at com.pigdroid.gameboard.view.ServiceFragment$3.bound(ServiceFragment.java:52)             at com.pigdroid.gameboard.view.ServiceFragment$3.bound(ServiceFragment.java:48)             at com.pigdroid.android.hateaidl.HateAIDLConnection$3.onServiceConnected(HateAIDLConnection.java:118)             at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1101)             at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1118)             at android.os.Handler.handleCallback(Handler.java:733)             at android.os.Handler.dispatchMessage(Handler.java:95)             at android.os.Looper.loop(Looper.java:136)             at android.app.ActivityThread.main(ActivityThread.java:5001)             at java.lang.reflect.Method.invokeNative(Native Method)             at java.lang.reflect.Method.invoke(Method.java:515)             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)             at dalvik.system.NativeStart.main(Native Method) 

EDIT: He llenado un problema para el equipo de desarrollo de Android y han notado el error como una característica, incluso cuando funciona perfectamente bien en versiones posteriores. Si alguno encontró este anoying, intenta votar por la reapertura: https://code.google.com/p/android/issues/detail?id=178607

He echado un vistazo al método fallando ObjectBinder.findClassInMap que obtienen el cargador de clase como este: ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

Supongo que hay una mala instalación del cargador de la clase multi dex porque he configurado el cargador yo mismo antes de que ocurra mi deserialización y arregló el problema.

La línea fixin 'el error que he añadido justo antes de cargar mi modelo de juego va como esto:

  Thread.currentThread().setContextClassLoader(owner.getActivity().getBaseContext().getClassLoader()); 
  • Usando HttpClient y HttpPost en Android con parámetros post
  • POST cuerpo JSON utilizando Retrofit
  • Android Volley Null Pointer Exception
  • Finalización de la construcción de objetos después de la deserialización de GSON
  • Cómo crear datos JSON con cierta complejidad?
  • Objeto de matriz Iterate JSON
  • Acelerar objetos JSON
  • Enviar JSON como una solicitud POST al servidor por AsyncHttpClient
  • Transmisión de una matriz JSON entre actividades por intención
  • JSONException: Índice 5 fuera del rango
  • Gson no puede analizar una cadena de datos de formato json en Kotlin
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.