博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Freescale IMX6 Android (7): Android启动动画死循环 Home界面不出来与pid XXX exit 可能的原因汇总
阅读量:4170 次
发布时间:2019-05-26

本文共 3078 字,大约阅读时间需要 10 分钟。

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

第一类:binder相关

binder: release 3000:3000 transaction 12769 out, still activebinder: 2720:2720 transaction failed 29189, size 4-0binder: send failed reply for transaction 12769, target dead
这一类的问题,一般都是因为某个进程退出了,因此binder消息无法发送过去了,因此和下面第二类比较类似。

第二类:pid XXX exit

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

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

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

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

进程需要的资源无法获得

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

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

进程程序有问题

在前面的博客:,实践中就遇到过这个问题,且最终发现是自己写的问题。

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

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

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***Build fingerprint: 'Freescale/sabresd_6dq/sabresd_6dq:4.3/1.1.0-rc4/20131206:eng/dev-keys'Revision: '405522'pid: 15565, tid: 15565, name: system_server  >>> system_server <<
可以看到其实我native函数的声明与实际的定义类型不匹配导致的。

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

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

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

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

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

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

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

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

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

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

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

$ git diff arch/arm/mach-mx6/board-mx6q_sabresd.cdiff --git a/arch/arm/mach-mx6/board-mx6q_sabresd.c b/arch/arm/mach-mx6/board-mx6q_sabresd.cindex fd1f3fd..5ca39e0 100644--- a/arch/arm/mach-mx6/board-mx6q_sabresd.c+++ b/arch/arm/mach-mx6/board-mx6q_sabresd.c@@ -1328,9 +1328,9 @@ static void __init mx6_sabresd_board_init(void)        imx6q_add_mipi_dsi(&mipi_dsi_pdata);        imx6q_add_lcdif(&lcdif_data);        imx6q_add_ldb(&ldb_data);-       imx6q_add_v4l2_output(0);-       imx6q_add_v4l2_capture(0, &capture_data[0]);-       imx6q_add_v4l2_capture(1, &capture_data[1]);+       //imx6q_add_v4l2_output(0);+       //imx6q_add_v4l2_capture(0, &capture_data[0]);+       //imx6q_add_v4l2_capture(1, &capture_data[1]);        imx6q_add_mipi_csi2(&mipi_csi2_pdata);        imx6q_add_imx_snvs_rtc();
上面总共给出了五种可能,也有一些其他的情况,例如可能某些库的不匹配导致软件的问题,等不一而足。

转载地址:http://uubai.baihongyu.com/

你可能感兴趣的文章
1.2W 字的 SQL 语法速成手册
查看>>
19 张图概览 Spring Cloud
查看>>
高并发、高可用、高可靠微服务架构7大顶级设计思维模型
查看>>
初探InnoDB存储引擎的架构设计
查看>>
今日头条技术架构分析
查看>>
Java工程师的进阶之路 Kafka篇
查看>>
巧用二进制,让性能提升100倍,让存储空间减少100倍
查看>>
Java单例模式实现,一次性学完整,面试加分项
查看>>
大型分布式网站架构总结
查看>>
死磕18个Java8日期处理,工作必用!收藏起来~
查看>>
【建议收藏】Spring Boot注解全梳理!
查看>>
卧槽!牛皮了,头一次见有大佬把TCP三次握手四次挥手解释的这么明白
查看>>
面试 Redis 没底?这 40 道面试题让你不再慌(附答案)
查看>>
浅谈Java Web经典三层架构和MVC框架模式
查看>>
MySQL 常用优化指南,及大表优化思路都在这了!
查看>>
JVM原理与深度调优
查看>>
在线等,Kafka如果丢了消息怎么办?
查看>>
如何设计实现一个通用的微服务架构?高可靠、高可用思维模型
查看>>
20张图助你了解JVM运行时数据区,你还觉得枯燥吗?
查看>>
MQ消息中间件,面试能问写什么?
查看>>