【发布时间】:2015-06-26 10:34:13
【问题描述】:
我有一个适用于 Android 设备的 multidex 项目。我使用 Flexjson。我已经用 flexjson 3.3 和 2.x 对其进行了测试。
它在 android 5.x 上运行良好,但在 Android 4.4.4 中崩溃。
Dex 支持库似乎不适用于旧 Android 版本,但我无法确定。
这是我的堆栈跟踪:
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)
编辑:我已经向 Android 开发团队提交了一个问题,他们已经将这个错误作为一个功能注意到,即使它在以后的版本中运行良好。如果有人觉得这很烦人,请尝试为重新开放投票:https://code.google.com/p/android/issues/detail?id=178607
【问题讨论】:
-
这段代码到底什么时候被执行?您能否展开堆栈跟踪(显示谁调用了 ObjectBinder#bindIntoObject 等)?
-
@Alex Lipov,我已经添加了完整的堆栈跟踪。
ObjectBinder#bindIntoObject被 flex 反序列化器内部调用 -
太棒了。为了更好地了解正在发生的事情 - 哪个组件建立了与服务的连接(谁使用 HateAIDLConnection$3 类的实例调用 bindService)?是应用吗?活动?广播接收器?
-
片段正在绑定到服务。服务绑定后调用
onServiceConnected方法。这根本不重要,这就是为什么我在第一次发布它时删除了堆栈跟踪的其余部分。因为 bind-unbind 和 listener 的东西似乎工作得很好。我再说一遍:在我使用服务加载数据之前,flex 在 Android 4.4.4 中也失败了 -
根据日志,包名称似乎有些不一致。你的包名是
com.pigdroid.gameboard还是com.pigdroid.game?您最近是否更改了包名但忘记更新引用类的包名?
标签: android json deserialization flexjson android-multidex