我的一个应用程序出了问题,我想知道是什么原因导致的。我遇到了一个ClassNotFoundException错误,以下是关键代码行:
E/AndroidRuntime(21982): Caused by: java.lang.ClassNotFoundException: couk.doridori.goigo.customUI.GoBoardView in loader dalvik.system.PathClassLoader@446fc3d0
现在这个应用已经发布了一年多,2天前我收到两个不同的用户联系我反映这个问题,一个使用HTC wildfire (2.1),另一个使用三星 Galaxy S (?)。但是我无法在我的设备上(2.2和1.6)或模拟器(2.1)上重现这个问题,并且无法弄清楚为什么类加载器找不到这个类。我已经搜索了一段时间,但没有任何进展,希望有人能提供一些指引!似乎只有当加载一个 activity 并且设置 contentView 时,它才会尝试膨胀一个名为 GoBoardView 的自定义视图,该视图扩展了 View 类,仅进行一些简单的画布绘制,没有使用任何第三方库或会导致包命名冲突的其他类。
请帮忙!以防万一是构建问题,我正在通过 Eclipse 更新所有的 SDK 和 ADT,因为它是针对 1.6 构建并使用旧版 ADT,但我不知道这是否有所帮助,只是觉得值得一试。感谢您的任何建议!(请参见下面的编辑)
E/AndroidRuntime(21982): java.lang.RuntimeException: Unable to start activity ComponentInfo{couk.doridori.goigoFull/couk.doridori.goigoFull.Board}: android.view.InflateException: Binary XML file line #14: Error inflating class couk.doridori.goigo.customUI.GoBoardView
E/AndroidRuntime(21982): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2596)
E/AndroidRuntime(21982): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621)
E/AndroidRuntime(21982): at android.app.ActivityThread.access$2200(ActivityThread.java:126)
E/AndroidRuntime(21982): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1932)
E/AndroidRuntime(21982): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(21982): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(21982): at android.app.ActivityThread.main(ActivityThread.java:4603)
E/AndroidRuntime(21982): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(21982): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(21982): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
E/AndroidRuntime(21982): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
E/AndroidRuntime(21982): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(21982): Caused by: android.view.InflateException: Binary XML file line #14: Error inflating class couk.doridori.goigo.customUI.GoBoardView
E/AndroidRuntime(21982): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:576)
E/AndroidRuntime(21982): at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
E/AndroidRuntime(21982): at android.view.LayoutInflater.rInflate(LayoutInflater.java:621)
E/AndroidRuntime(21982): at android.view.LayoutInflater.rInflate(LayoutInflater.java:621)
E/AndroidRuntime(21982): at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
E/AndroidRuntime(21982): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
E/AndroidRuntime(21982): at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
E/AndroidRuntime(21982): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207)
E/AndroidRuntime(21982): at android.app.Activity.setContentView(Activity.java:1629)
E/AndroidRuntime(21982): at couk.doridori.goigoFull.Board.onCreate(Board.java:31)
E/AndroidRuntime(21982): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime(21982): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544)
E/AndroidRuntime(21982): ... 11 more
E/AndroidRuntime(21982): Caused by: java.lang.ClassNotFoundException: couk.doridori.goigo.customUI.GoBoardView in loader dalvik.system.PathClassLoader@446fc3d0
E/AndroidRuntime(21982): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
E/AndroidRuntime(21982): at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
E/AndroidRuntime(21982): at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
E/AndroidRuntime(21982): at android.view.LayoutInflater.createView(LayoutInflater.java:466)
E/AndroidRuntime(21982): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:565)
E/AndroidRuntime(21982): ... 22 more
编辑
好的,研究了一些用户在回复这个问题时提供的链接,似乎在加载活动时使用错误的上下文可能会导致此问题。我觉得这很有趣,因为我收到的两份日志报告中的其中之一在此异常之前出现了。
W/ActivityManager( 1222): startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent { flg=0x20000 cmp=couk.doridori.goigoFull/.Games }
这很容易理解——问题是我不知道这个活动从哪里开始,它使用了一个非活动上下文,所以我有点困惑,认为可能是一些多任务的怪癖,并且被带回到某个前景中。这显然会导致ClassLoader的问题。如果这在用户手机上发生,我不明白为什么我无法重现这个问题(大多数其他用户也不能)。
我在链接中发现的另一件有趣的事情是,有些人遇到了由于“错误的apk安装”而引起的问题,可以通过重新安装来解决,我已经要求遇到问题的用户尝试过(但没有改变)。此外,似乎一旦出现问题(在第一次使用时),它就会持续存在。