【问题标题】:Android device reboots occasionallyAndroid 设备偶尔会重启
【发布时间】:2012-06-29 20:52:14
【问题描述】:

我们正在实际设备上测试我们的 Android 应用,发现其中一些应用在运行 2-3 小时后偶尔会重新启动。该应用程序由一个具有 3 个线程(带有 GPS 和网络)的服务和两个活动组成,其中一个是资源消耗的(显示地图)

Logcat 没有帮助,因为在设备重新启动之前我们没有看到任何重要消息。有时设备甚至无法启动,只有取出电池才能重新启动。

这些设备基于不同的硬件,在不同的国家(主要是中国,呵呵)生产并使用不同的 Android 版本。

可能导致设备重启的最常见问题是什么?如何调试?

【问题讨论】:

  • 10 个月后,到底是什么原因造成的?
  • 有些设备在使用 GPS 超过一个小时左右时似乎会过热。

标签: android debugging


【解决方案1】:

Android 有两种重启方式:

  1. 系统服务器故障。在这种情况下,不会发生重新启动,而是 Zygote 会重新启动。常见原因:

    • Watchdog 杀死了一个 system_server 进程,因为它正在运行的服务出现死锁。
    • 系统服务之一发生致命异常。但是,实际原因有时可能是硬件问题。例如,在某些情况下,恢复出厂设置后ext2 分区的格式不如下。这会导致错误,/data/ 分区被挂载为只读,这会产生一堆错误。
    • 在极少数情况下,由于内存和 CPU 使用率过高,看门狗可能会超时。

    两者都非常罕见,主要可以在猴子测试中重现,而不是真实案例场景。通过使用adb shell 杀死service_manager 进程,您可能会看到logcat 输出的示例。

  2. 内核恐慌。在这种情况下,设备实际上会重新启动。由于内核恐慌发生在 Android 之外的层上,它不会产生任何 logcat 输出。相反,它会将堆栈跟踪写入控制台。您可以从/dev/kmsg 或 ADB shell:adb shell dmesg 阅读它。

    不幸的是,在大多数设备上控制台输出被禁用,并且kmsg 缓冲区将在每次重新启动时被擦除,因此很难读取这些内容。

附:重新启动也可能是由硬件问题引起的。在这种情况下,它不太可能找到任何痕迹,但希望只能在特定设备上重现。

【讨论】:

  • 谢谢安德烈。我认为如果问题的根源在于 Zygote,那么我们应该会看到一些日志消息。只要我不记得,那可能是KP。无论如何,我们将尝试杀死 service_manager 并观察日志中的差异。
【解决方案2】:

我遇到了类似的问题(还有 gps 和网络)我忘记将网络更新计时器设置为生产(15 分钟)所以设备每 15 秒更新一次> 尽量减少 CPU 使用率(分析)或确保适当的冷却机制

【讨论】:

  • 是的,我们在调试/测试中进行了非常繁重的网络工作,而且 GPS 接收器会消耗大量电力并且会发热很多。但是重启设备比稳定设备要冷一些。我的带有 2.1 的 Nuvifone、带有 2.x cyanogen 的 Xperia、带有 4.0 的 Iconia 以及带有 2.1、2.2、2.3.x 和 4.x 的几个中国无名设备运行良好,尽管它们变得非常热(我的 Nuvifone 已经准备好煮咖啡了) .不管怎样,CPU使用率正常,大部分GPS访问变热了。
  • 如果我理解正确的话,该设备的外部可能更冷,但内部更热沟通它会工作
【解决方案3】:

根据您提供的信息,听起来您很可能泄露了Thread。您可以使用 DDMS 在应用程序的执行过程中分析 thread usage。另一种可能性是您只是内存不足...您也可以使用 DDMS 来帮助您解决这个问题。

【讨论】:

  • 谢谢。但是为什么服务和/或活动没有被杀死和 GC'ed?
  • 服务是长期存在的进程,即使在应用程序停止运行后仍然存在......因此您需要在必要时取消注册它们。 Activity 不会被 GC,因为底层 Android 系统会在设备资源不足时销毁 Activity。
  • 如果,如您所见,“...只是内存不足”,Activity 被杀死、销毁并释放内存,但不会发生。服务也不会被杀死(尽管它们可以被杀死),顺便说一句,服务和活动共享相同的应用程序对象。所以我不确定这是内存不足的问题(但是,这可能是 OEM andrid 构建中的错误?)
  • 更新:关闭 USB 调试似乎有点帮助 - 应用程序运行时间延长了两倍。顺便说一句,我们正在做很多日志记录,它会影响吗?
  • 有趣的观察。我在记录/调试时也遇到了长期稳定性问题,有时手机会决定锁定或重置。有时,其他应用程序的缓存损坏文件会受到阻碍,唯一的解决方案是在系统服务模式下擦除缓存分区。 Android 调试可能是一件很脆弱的事情。
【解决方案4】:

这很可能是 GPS 接收器打开时出现过热问题。关闭 GPS 并从手机网络获取位置后,该应用程序可以平稳运行数小时。

感谢大家的回复和想法!

【讨论】:

    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    相关资源
    最近更新 更多