2

任何 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 本机代码的深处存在某种形式的竞争条件。这对我们来说是一个很大的展示。任何建议如何最好地进行?

4

0 回答 0