任何特殊的Android死锁调试技巧?

时间:2012-01-07 21:30:24

标签: android

我一直在为Android项目构建一个漂亮的图形选择器。不幸的是,由于应用程序的UI线程中存在死锁,这个选择器让我感到非常沮丧。解析和渲染构成每个时钟的各种SVG层是相对昂贵的操作。在进行这些操作时锁定用户界面显然是糟糕的设计,所以我努力提供良好的反馈。

选择器由两列组成,左边是时钟图像,右边是时钟名称。使用标准的ListActivity支持,目标是在左列中显示不确定的进度图像,直到加载和渲染时钟图层。此时,隐藏动画进度图像并显示时钟图像。

实施在概念上很简单。列表适配器是标准BaseAdapter实现的子类,以提供getView方法的实现。 getView方法将时钟图像的加载委托给异步执行程序服务,使用户界面保持活动状态。当异步任务完成时,它会将一个runnable发布到UI线程以隐藏进度指示器并显示图像视图。还有与正确处理回收物品视图相关的逻辑。

虽然这主要是有效的,但是我遇到了一个锁定UI线程的随机死锁条件,通常会导致向用户发出“应用程序无响应”(ANR)错误消息。我所有的诊断和解决这个问题的尝试都以失败告终。到目前为止,我已经尝试了所有“标准”方法来诊断这个:

  • 分析了ANR生成的traces.txt文件 不幸的是,该进程从未出现在日志文件中。 在应用程序仍在运行时,使用kill SIGQUIT pid强制生成一个traces.txt文件。同样,这个过程似乎没有出现。相反,每当尝试这个时,我都会看到“W / dalvikvm(19144):threadid = 4:旋转暂停#1 threadid = 9(pcf = 0)”。
  • 启用内核级死锁预测,但它从未显示任何内容
  • 一旦锁定了UI线程,就尝试使用标准的Eclipse调试器来挂起它。 毫无疑问,它没有用。添加了大量的日志输出,试图查明挂起。至少从该日志记录中,它似乎不是直接在我的代码中的任何地方挂起。
  • 我甚至尝试使用方法跟踪来查看是否可以解决任何问题。

此时,我已经完成了关于如何自行追踪并解决此问题的好主意。我删除了我的代码中的所有同步,我仍然挂断,暗示在底层平台代码中有某种挂起。没有堆栈跟踪,我在这一点上真的是盲目的。任何人都可以提出任何想法吗?

0 个答案:

没有答案