Freescale IMX6 Android (7): Android启动动画死循环 Home界面不出来与pid XXX exit 可能的原因汇总

或许你某一次编译了整个Android,然后烧进去,结果屏幕中一直显示Android Bootanimation,Home界面一直不出来。对此,可能有以下五类原因,往这几个方向考虑与调查可能可以提供一些线索。前面两类是属于软件的,后面两类属于硬件。最后一类属于软件硬件都相关。

第一类:binder相关

这一类的问题,一般都是因为某个进程退出了,因此binder消息无法发送过去了,因此和下面第二类比较类似。


第二类:pid XXX exit

这类log会不断输出,表现为某个或者某几个线程不断的重启。为何会不断的重启,因为这个是系统关键的线程,可能是守护进程。

那么就需要调查程序为什么会退出,这一般有三种可能的原因:

  1. 进程需要的资源无法获得
  2. 进程程序有问题
  3. 有其他进程在不断的kill(发信号)这个进程

这几类都遇到过,下面举例说明。

进程需要的资源无法获得

有可能是某个分区坏了,而这个线程一定需要在这个分区创建某个文件并写入数据才能执行。

有一些Service可能需要某个属性的值变成特定的值才能运行。

进程程序有问题

在前面的博客:Freescale IMX6 Android (6): 向ServerManager中添加Service,实践中就遇到过这个问题,且最终发现是自己写的问题。

那么如何解决呢? 看log,有时候会出现误解,例如log可能看到的A进程不对重启,但是实际上可能是因为A进程依赖B进程,而B进程有问题自己退出了,所以A进程就一直等不到或者发现B进程死了,也退出了,但是B进程退出的时候居然没有提示。于是我们误认为是A进程有问题,但是实际是B进程的问题。对此,我们可以看Android的tombstone。不同系统的tombstone存放的位置可能不大一样,但是一般默认是放在/data/tombstone下面的。

例如某一次启动后不出现Home画面,且提示mediaServer与btd不同重启,但是查看tombstone却发现是我在SystemServer中添加了代码导致的:


可以看到其实我native函数的声明与实际的定义类型不匹配导致的。

有其他进程在不断的kill(发信号)这个进程

这个一般出现在资源互斥的情况下,例如只有一个摄像头,但是两个进程都需要,且某一个进程的做法是如果其他进程在使用这个设备,那么kill掉它。尽管这种做法很流氓,但是实际中,有的时候为了快速响应,也是可以理解的。

第三类:某个硬件相关的驱动不停的打印log

例如,我的PC的USB接口有些松动了,如果adb先接到这个端口,就会不断的出现下面的log:


这个是因为硬件接触的问题导致一下子接好马上就松开了,于是USB驱动不断产生中断,内核不断发送event到上层。

对于这种持续不断大量的中断产生,内核大部分的CPU时间都用去处理中断了,因为中断的优先级比非NMI中断外的任务都高,且中断的上半部分会关闭中断与调度,因此系统启动会变得特别的慢,看起来就向一直启动不来似的。

第四类:没有特殊的log输出,但是系统一直卡住

这个也在实际中遇到过,而且几乎可以肯定是内核(硬件)问题,例如产生某个NMI中断硬件一直产生中断,这个最终将会导致CPU无法调度其他任何任务而freeze。

第五类:硬件出现问题,软件等不到这个硬件不断重启

例如某次启动后不断打印如下log:


然后一个service依赖这个v4l2_capture(摄像头)设备,于是不断的去检测,不存在就退出,然后又被启动起来又检测发现不存在又退出。对此,我们可以插上这个硬件,也可以直接去掉对这个设备的检测,甚至可以在内核中不要添加这个设备,例如在TQIMX6Q的内核中可以注释掉下面的语句来解决这个问题:


上面总共给出了五种可能,也有一些其他的情况,例如可能某些库的不匹配导致软件的问题,等不一而足。

Leave a Reply

Your email address will not be published. Required fields are marked *