Android5.0L因SystemUI ANR导致的黑屏问题分析

一、问题现象

1、用户直观看到的现象是黑屏。

2、出问题时StatusBar、NavigationBar和墙纸消失。

3、大部分发生在FOTA重启之后,出现概率很低。

Platform:MSM8916

Android版本:5.0.2L

BuildType:user

系统软件版本:VA6V+L5V0

系统RAM:1GB

参考机行为:

1、5.0L的Nexus4和5.1L的Nexus5都没有重现此问题。

二、解决方案

通过初步分析、深入分析(具体分析过程、关键代码和log在下面会附上)我们清楚的知道了问题发生的原因:

1、开机初始化的过程中需要获取camera的相关参数,获取的过程中会以api级别打开camera(用户不可见的形式打开)然后快速关闭

2、在打开的过程中会开启一个Thermal deamon 线程进行thermal相关的处理,然后关闭时会等待这个thermal deamon线程退出

3、这个线程开启的时候会通过异步的方式执行一次thermal相关的处理,并等待结果返回, 执行的方式是多线程异步处理

在当前代码的执行状态下有一定概率(很小,只有开机或者重启时走这个流程)出现因为调度原因而先执行了closecamera的操作并先删除了异步处理结果的链表,然后等待thermal  deamon线程退出,从而导致thermal deamon被唤醒时异步处理结果的链表已经被删除而出现死结。一旦死结产生,SystemUI就会ANR,然后依附于SystemUI的statusbar和navigationbar以及imagewallpaper都会被阻塞,一旦SystemUI进程被Kill,这些组件都会消失,产生黑屏现象。

针对以上问题的根本原因,我们给出以下解决方案:

1、修正代码的处理顺序

Closecamera时先执行m_thermalAdapter.deinit等待thermal deamon线程将结果处理完成退出并返回,再free all pending api results,因为m_thermalAdapter.deinit会依赖pending api results,这同样是遵循初始化和反初始化的栈原则,即opencamera时最后初始化的是依赖别人最多的,但是不被别人依赖,因此closecamera时需要先反初始化在opencamera时最后初始化的,按照栈的方式原则处理。

2、方案相关的具体代码和log

以上是发生死锁时锁对应的log以及相应代码和调用栈,通过红线圈住部分我们可以看到发生问题时的关键调用关系和状态,同时也给出了代码处理顺序有问题的地方。

3、最终方案的代码修改

三、问题初步分析

以Idol347出问题时候的一份典型trace和log为例,发现出问题时SystemUI的主线程block在了一个向CameraService发起的Binder调用中,从而导致SystemUI

的后续事件TimeOut引起ANR,主线程的具体trace如下:

然后继续追踪CameraService的服务端的trace,发现/system/bin/mediaserver中的处理CameraService的Binder线程也被block了,然后追踪trace中各个线程的调用栈和互斥锁的使用,发现处理调用CameraService的addlistener的Binderthread之所以被阻塞,是因为另外一个binder thread先占用了锁,然后在占用的过程中去注册thermal回调,但是注册的过程需要占用另外一个锁,但是这个锁被第三个thread在注销thermal回调的时候先占用,并且join另外一个thread,因此整个依赖环需要另外一个thread退出才能解,从当前的问题现象来看,这个thread不会太快退出,所以导致了ANR和黑屏问题。

通过初步分析我们发现的问题:

是否需要占用着锁的情况下去join另外一个thread,或者这种状态是否合理?

具体的调用栈和代码中锁的关系如下:

四、深入分析问题

经过初步我们定位到了第一个问题点,同时也产生了1个问题,接下来我们继续深入分析以期能到找到答案和问题的根本原因。

1、是否需要占用着锁的情况下去join另外一个thread,或者这种状态是否合理?

通过进一步分析和查看代码发现,Join的另外一个thread不能很快退出是因为它在执行callback时等待另外一个条件的满足,具体逻辑调用关系如下:

另外一个条件之所以不满足的原因:

开机初始化的过程中需要获取camera的相关参数,获取的过程中会以api级别打开camera(用户不可见的形式打开)然后快速关闭,在打开的过程中会开启一个Thermal deamon 线程进行thermal相关的处理,然后关闭时会等待这个thermal deamon线程退出,但是这个线程开启的时候会通过异步的方式执行一次thermal相关的处理,并等待结果返回,由于是多线程的异步处理,在当前代码的执行状态下就有一定概率(很小)出现因为调度原因而先执行了closecamera的操作并先删除了异步处理结果的链表,然后等待thermal  deamon线程退出,从而导致thermal deamon被唤醒时异步处理结果的链表已经被删除而出现死结。

一旦死结产生,SystemUI就会ANR,然后依附于SystemUI的statusbar和navigationbar以及imagewallpaper都会被阻塞,一旦SystemUI进程被Kill,这些组件都会消失,产生黑屏现象。

五、其他相关问题

第一个问题:为什么大部分发生在FOTA升级之后?

分析:由于这个问题是发生在启动或者重启时,而且只有这个过程才会有很小概率触发。而FOTA之后会自动重启,所以就有概率触发这个问题,由于用户平时使用中很少重启,所以概率不高。

Analyzed by vincent.song from SWD2 Framework team.

vincent.song@tcl.com

201505221140

时间: 2024-09-04 07:19:24

Android5.0L因SystemUI ANR导致的黑屏问题分析的相关文章

Android5.0L中SensorService crash导致的systemserver重启问题分析

一.初步分析结论 sensorservice多线程机制存在问题,导致在disable accel sensor并释放相应内存和数据之后, 有很小的概率发生继续读取到未处理完的sensor事件,从而继续使用相应的内存和数据, 并且没有做相应的防御保护措施,最终引起指针地址操作错误. 二.解决方案 1.首先在可能发生错误的地方做好防御保护措施 2.对多线程进行同步,对于临界变量的操作都放置到临界区中,使用锁来保护. 三.具体分析过程 log中显示打出accel sensor被disable的信息,然

win7系统explorer.exe遭到破坏导致开机黑屏怎么办?

  win7系统explorer.exe遭到破坏导致开机黑屏怎么办?          1.按"win+r"打开"运行"窗口,输入"regedit"命令后按回车打开注册表编辑器.         相关知识:win7系统调整视频颜色的方法 2.在打开的注册表中定位到exploer.exe服务绝对路径,查看一下shell数据的数值是否exploer.exe服务,如果不是exploer.exe时,将其可以直接更改为exploer.exe.保存设置后退出

微软否认安全补丁会导致系统黑屏

北京时间12月2日早间消息,据国外媒体报道,针对有媒体报道称微软最新发布的一批安全补丁将导致部分电脑死机并显示黑屏,微软1日予以否认.微软称,没有发现证据表明最新的安全补丁会导致Windows 7操作系统出现问题. 据悉,一小部分微软用户发现,在登陆操作系统后,这一问题将导致彻底黑屏.英国软件安全公司Prevx表示,受到这一问题影响的微软产品包括Windows 7.Vista和XP.英国广播公司1日对此予以报道,引发广泛关注. Prevx声称微软对操作系统注册表的更改是导致出现错误的最可能原因,

360 wifi导致系统蓝屏问题分析

win7系统下载 http://www.pgos.cc/资讯:免费wifi或者是wifi精灵是一种利用笔记本之中自带的无线网卡实现无线网络路由器虚拟功能的软件,在所有拥有无线网卡的笔记本之中此类软件基本都是可以运行.但是其工作的稳定程序还是应当视情况判定.比如说现在很多的用户在使用360所提供的免费wifi的时候就是遇到了操作系统的蓝屏故障. 360 wifi出现蓝屏的情况 在初次打开360 wifi的时候蓝屏是不会出现的,但是一旦是存在虚拟wifi接入设备并且等待一段时间的话,有百分之九十以上

基于android4.4系统行车记录应用黑屏问题分析及对策

基于android4.4系统行车记录应用黑屏问题分析及对策           笔者最近遇到一个棘手的问题,那就是行车记录应用出现黑屏的问题,现象就是进入行车记录应用surface是黑的,录像文件几分钟一个的那种,每个文件的大小都是零.看到这个大家都非常重视,对于车载产品来说,行车记录功能需要保持长时间正常工作,出现这种问题肯定是不能接受的,必须解决!那这个问题是怎么出现的呢?        跟了很长时间,同时动用了8台相同的机器来单独做行车记录的拷机测试,12个小时内都不会出问题,但是超过24

导致电脑黑屏的两个经典原因

电脑黑屏故障的原因有很多种,有时很简单的一个差失就会导致,找到原因后才恍然大悟.下面就是一个电脑黑屏的案例分析: 发现故障:笔者的电脑放在寝室里,许多朋友一起使用,而且经常有人搞恶作剧,突然把电源切断,所以爱机经常"饱受凌辱".这天晚上笔者照例开机,趁开机时间去洗脸刷牙.可直到洗漱完回来,显示器还一点反应都没有,怎么回事?凭直觉我马上按下主机电源开关,可不关还好一关才发现不管怎么关主机灯都是亮着的,连忙切断电源! 走投无路:难道是病毒作怪了?不可能,还没有听说哪个病毒不让关机呢!于是再

导致笔记本黑屏的硬件损坏检测方法

  一般能导致黑屏的最常见最关键的几个硬件有电源.液晶显示器.内存条.硬盘.主板等.这需要我们来一一排除.由于笔记本比较精密,拆卸比较复杂,一般自己动手都是比较困难的,但是我们可以先自己查出原因再拿去维修就可以省下不少钱或者觉得比较简单点的自己动手维修. 首先,来检查电源,看看笔记本电池是否有电,电源插头是否插好,这只需要看电源指示灯有没有亮,如果没有外接电源,先用外接电源插好.之前小编有一朋友笔记本黑屏慌慌张张跑来拿给我看,小编问他:笔记本有没有摔过,小孩有没有坐过,乱搞过(碰到过被小孩坐坏的

什么原因导致电脑黑屏

  分析原因:难道是病毒作怪了?不可能,还没有听说哪个病毒不让关机呢!于是再次开机,静观其变,这次发现开机时主机没有报警声,电源风扇正常,CPU风扇也正常,那是怎么回事?在没有其他办法的情况下,向朋友借来一台电脑,采用替换法来逐一检查.第一个被检查的是显卡,因为黑屏嘛,但换上新显卡开机还是老样子,排除显卡因素.对了,不是无法关闭主机电源吗?会不会是电源问题?于是接着换下电源,没发现任何问题!那会不会是经常被断电导致硬盘"寿终正寝"了?嗯!有可能.所以就马上将自己的硬盘卸下,插上另一个好

过高分辨率导致电脑黑屏的一个解决方法

我用电脑的时候,一直习惯用1024*768这个分辨率,用着舒服,倒也没有出过什么问题. 姐姐家的孩子要学习电脑,这几天我晚上一直在家里教他一些基本的操作.昨晚出了个不大不小的问题,原因是我告诉他:你用右键点桌面"我的电脑",在对话框的"设置"那一页里用鼠标拖动上面的滚动条,可以调整显示器的分辨率,然后我就向后拖动了一下,点了"应用",结果电脑突然黑屏了,重启后依然是黑屏. 打电话请教认识的某朋友,告诉了我原因:你的显示器不行,太老,过高的分辨率支