安卓设备偶尔重启

6
我们正在真实设备上测试我们的Android应用程序,发现其中一些设备在应用程序运行2-3小时后偶尔重新启动。该应用程序由一个服务和3个线程(带有GPS和网络)以及两个活动组成,其中一个活动消耗较多资源(显示地图)。
Logcat没有帮助,因为我们在设备重新启动之前没有看到任何重要消息。有时设备甚至无法启动,只有拆掉电池才能重新启动。
这些设备基于不同的硬件,生产于不同的国家(大多数是中国),并使用不同的Android版本。
什么是可能导致设备重新启动的最常见问题,以及如何调试它?

1
10个月后,你最终找到了导致这个问题的原因吗? - jcage
1
当使用GPS超过一个小时左右时,似乎一些设备会过热。 - saabeilin
4个回答

4

Android系统中有两种重启方式:

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

    • 看门狗因为服务死锁而杀死了system_server进程。
    • 某个系统服务发生致命异常。不过,实际原因有时可能是硬件问题。例如,在某些情况下,经过出厂设置重置后,ext2分区未按预期格式化,导致错误,/data/分区被挂载为只读,从而产生一系列错误。
    • 在极少数情况下,由于内存和CPU使用率过高,看门狗可能会超时。

    这两种情况都很少见,多数只在测试中出现而不是真实场景中。您可以通过使用adb shell杀死service_manager进程来查看日志输出的示例。

  2. 内核崩溃。在这种情况下,设备确实会重启。由于内核崩溃发生在Android系统之外的层级,它不会产生任何日志输出。相反,它将在控制台中写入堆栈跟踪信息。您可以从/dev/kmsg或ADB shell:adb shell dmesg读取它。

    不幸的是,由于大多数设备禁用了控制台输出,并且每次重启都会清除kmsg缓冲区,因此很难读取这些信息。

P.S. 另外,重启可能是由硬件问题引起的。在这种情况下,不太可能找到任何痕迹,但希望这只会在特定设备上出现。


谢谢Andrey。我认为如果问题的根源在Zygote中,我们应该能看到一些日志信息。但是我记不起来有什么了,这可能是一个KP(内核崩溃)。无论如何,我们将尝试杀死service_manager并观察日志中的差异。 - saabeilin

1

我曾经遇到过类似的问题(也是GPS和网络相关的),我忘记将网络更新计时器设置为生产模式(15分钟),因此设备每15秒更新一次,最终导致设备过热(HTC Desire)。
尝试最小化CPU使用率(分析)或确保适当的冷却机制。


是的,我们在调试/测试中进行了非常重的网络操作,加上GPS接收器消耗大量电力并且会发热。但是重新启动的设备比稳定的设备要冷一些。我的Nuvifone 2.1版、Xperia 2.x青柠版、Iconia 4.0版以及几个中国无名设备的2.1、2.2、2.3.x和4.x版本都运行良好,尽管它们会变得非常热(我的Nuvifone已经可以泡咖啡了)。无论如何,CPU使用率正常,主要是GPS访问导致发热。 - saabeilin
设备外部可能会更凉爽,但内部却更热。如果我理解你的意思正确的话,来自不同供应商的设备可能具有不同的临界温度,请尝试关闭日志记录并最小化网络通信,它将正常工作。 - sherif

0
根据您提供的信息,看起来您很可能正在泄漏一个Thread。您可以使用DDMS分析应用程序在执行过程中的线程使用情况。另一个可能性是您只是耗尽了内存...您也可以使用DDMS来帮助您解决这个问题。

谢谢。但是为什么服务和/或活动没有被杀死和GC回收呢? - saabeilin
服务是长期进程,即使应用程序停止运行,它们仍然存在...因此您需要在必要时注销它们。活动不会被垃圾回收,因为底层的Android系统会在设备资源不足时销毁活动。 - Alex Lockwood
1
如果您注意到,如果“...内存简单地耗尽”,则活动将被杀死、销毁并释放内存,但实际上并没有发生。服务也不会被杀死(虽然它们可以被杀死),而且,顺便说一句,服务和活动共享同一个应用程序对象。因此,我不确定这是否是低内存问题(但是,这可能是OEM安卓构建中的错误?) - saabeilin
有趣的观察。我在记录/调试时也遇到了长期稳定性问题,有时手机会冻结或重置。有时候其他应用程序的缓存损坏文件挡在路上,唯一的解决办法是在系统服务模式下擦除缓存分区。Android 调试可能是一个脆弱的事情。 - tiguchi
@NobuGames Log有时会耗尽你的电池...但除非你在某个地方有一个while(true) Log.v("asdf")循环,否则我不认为它会升级到设备内存耗尽的程度。这听起来像是一个内存泄漏...你的目标应该是找到内存泄漏并摆脱它...而不是找到微不足道的方法来减轻内存泄漏的影响 :) - Alex Lockwood
显示剩余3条评论

0

当GPS接收器开启时,最有可能出现过热问题。关闭GPS,并从蜂窝网络获取位置,应用程序可以平稳运行数小时。

感谢大家的回复和想法!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接