2015-06-26 17 views
9

Ho un progetto multidex per dispositivi Android. Io uso Flexjson. L'ho già provato con flexjson 3.3 e 2.x.FlexJson ClassNotFound Eccezione su Android 4.4.4

Funziona perfettamente con Android 5.x ma si blocca su Android 4.4.4.

Sembra che la libreria di supporto Dex non funzioni correttamente con le versioni precedenti di Android, ma non posso dirlo.

Here's mia 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: Ive compilato un problema per il team di sviluppo di Android e they've notato il bug come caratteristica, anche quando funziona perfettamente bene su ultime versioni. Se una qualsiasi pensa che questa anoying, prova a votare per la riapertura: https://code.google.com/p/android/issues/detail?id=178607

+0

Quando esattamente questo codice viene eseguito? Potresti espandere la traccia dello stack (mostra chi chiama ObjectBinder # bindIntoObject, ecc.)? –

+0

@ Alex Lipov, ho aggiunto lo stacktrace completo. 'ObjectBinder # bindIntoObject' è chiamato internamente da flex deserializer – eduyayo

+0

Grande. Per capire meglio cosa sta succedendo - quale componente stabilisce una connessione a un servizio (chi chiama bindService con l'istanza della classe HateAIDLConnection $ 3)? È applicazione? Attività? BroadcastReceiver? –

risposta

1

Ive dato un'occhiata al metodo di non aver ObjectBinder.findClassInMap ottengono il caricatore di classe in questo modo: ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

suppongo tipo Theres di un installazione errata del caricatore di classi multi dex perché ho impostato il caricatore da solo prima che si verificasse la deserializzazione e ha risolto il problema.

La linea Fixin' l'errore Ive ha aggiunto poco prima di caricare il mio modello di gioco è questa:

Thread.currentThread().setContextClassLoader(owner.getActivity().getBaseContext().getClassLoader());