任何 android 专家都可以阐明为什么这种方法会挂起?
当我暂停线程并查看堆栈时:
Thread [<13> Thread-15] (Suspended)
DexFile.openDexFile(String, String, int) line: not available [native method]
DexFile.<init>(String, String, int) line: 105
DexFile.loadDex(String, String, int) line: 144
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 521
...您可以看到它挂在本机方法 DexFile.openDexFile 中,它永远不会返回。
这对我们正在编写的应用程序造成了严重的问题。它是随机发生的,因此表明多个线程之间存在某种竞争条件,但我连接了检测和死锁,而且我希望本机方法能够返回一些东西,即使是异常也会很好!
提前致谢
我正在使用 Android 2.2 Nexus One 设备,我正在将应用程序从 eclipse 部署到设备。为了确保我完全卸载了应用程序并重新启动设备,我仍然随机看到上述问题。
更新:我在 Android 2.3.3 模拟器(API 10)上重试并遇到了同样的问题。我现在确信这里有一个重大错误。我创建了一个简单的测试用例来显示问题。基本上,我将一个 dexified jar 添加到 android 项目的 assets 文件夹中。在启动时,我将此文件复制到应用程序数据区域。然后我启动 x 个线程并在每个线程中使用 DexFile.loadDex 加载这个 dexified jar 文件,但为生成的优化 dex 文件提供不同的输出文件名。如果您选择 x 表示 30 个线程,您几乎可以保证看到多个线程挂起。
只是为了确保我重复了测试,每个线程都有自己独特的 dexified jar 文件。出现同样的问题。
我看到的唯一 LogCat 输出可能提示出了什么问题:
02-23 11:59:23.097: 调试/dalvikvm(12598): DexOpt: 在羊群上睡觉(/data/dalvik-cache/system@framework@core.jar@classes.dex) 02-23 11:59:23.138:调试/dalvikvm(12602):DexOpt:在羊群上睡觉(/data/dalvik-cache/system@framework@core.jar@classes.dex)02-23 11:59:23.357:调试/dalvikvm(12602):DexOpt:在羊群上睡觉(/data/dalvik-cache/system@framework@framework.jar@classes.dex)02-23 11:59:23.419:调试/dalvikvm(12598):DexOpt:在羊群上睡觉(/data/dalvik- cache/system@framework@framework.jar@classes.dex) 02-23 11:59:23.528: DEBUG/dalvikvm(12608): DexOpt: 在羊群上睡觉(/data/dalvik-cache/system@framework@core.jar @classes.dex)02-23 11:59:23.577:调试/dalvikvm(12598):DexOpt:在羊群上睡觉(/data/dalvik-cache/system@framework@services.jar@classes.dex)02-23 11 :59:23.698:调试/dalvikvm(12606):DexOpt:睡在羊群上(/data/dalvik-cache/system@framework@core.jar@classes.dex)
另一个有趣的事情是,作为一个例子,我有一个 dexified jar 文件
myjar.jar(大小 5031)
每个打开这个 dex 文件的线程都会创建一个文件
myjar.jarX.dex(其中 X 是每个线程的唯一整数)(大小 4152)
未完成 DexFile.loadDex 调用的线程仍然设法创建了一个 myjar.jarX.dex 文件,但该文件的大小为 3496
我相信在 Dalvik 本机代码的深处存在某种形式的竞争条件。这对我们来说是一个很大的展示。任何建议如何最好地进行?