Android5.0 SystemUI ANR 黑屏原因解解决方案

本文我们来讲讲Android5.0L因SystemUI ANR导致的黑屏问题分析

一、问题现象

用户直观看到的现象是黑屏。出问题时StatusBar、NavigationBar和墙纸消失。大部分发生在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之后会自动重启,所以就有概率触发这个问题,由于用户平时使用中很少重启,所以概率不高。

时间: 2024-09-14 15:09:13

Android5.0 SystemUI ANR 黑屏原因解解决方案的相关文章

cf2.0开始游戏黑屏怎么办 cf2.0开始游戏后黑屏解决方法

游戏黑屏有很多的问题了,一般问题就是不兼容或屏幕分辨率设置问题了,像小编碰到的cf2.0游戏黑屏问题就是因为分辨率问题导致的了. [CF2.0游戏黑屏解决方法] 800x600和1280x800设置问题了,我们只要把游戏的分辨率设置1280x800就可以解决了. PS:如何选择1024x768分辨率: 1.我们在游戏客户端中点击"设置"界面,如下图所示打开 2.之后在进入的界面中我们找到"选择分辨率"选项中选取1024x768(普通)分辨率 之后打开进入. 好了如果

电脑黑屏原因分析

电脑为什么"黑屏"? 电脑黑屏的原因很多,常见的有: 1.显示器断电,或显示器数据线接触不良; 2.主板没有供电; 3.显卡接触不良或损坏; 4.CPU接触不良; 5.内存条接触不良; 6.机器感染CIH病毒,BIOS被破坏性刷新. 开机黑屏 现 象:开机黑屏,没有显示,可能会有报警声. 现象分析:硬件之间接触不良,或硬件发生故障,相关的硬件涉及到内存,显卡,CPU,主板,电源等.电脑的开机要先通过电源供电,再由主板的BIOS引导自检,而后通过CPU,内存,显卡等.这个过程反映在屏幕上

Win7电脑出现黑屏原因总结

  电脑为什么会黑屏? 一.硬件引起的电脑黑屏 设备不匹配.硬件之间的兼容性不好.硬件损坏.电压太低或太高.磁盘存在坏道坏扇区坏簇.内存条故障或容量不够.劣质硬件等都会导致电脑黑屏. 二.由软件引起的电脑黑屏 病毒干扰.软件兼容性差.非法操作.内存管理不当.缓冲区太多或太少.CMOS参数设置不当.磁盘空间太满.软件存在Bug.系统System等子目录中的.DLL动态链接库文件丢失.粗无修改了系统注册表信息都会造成电脑黑屏 三.系统运行时黑屏的原因 病毒感染.Windows的某些文件被应用软件的相

鲁大师显卡测试黑屏原因

  引起黑屏常见的主要原因如下: 1.视频设备连接不正常或损坏; 2.内存接触不良(机器会发警报)导致的无法开机; 3.显卡驱动冲突或异常(此情况一般可开机在进入系统时黑屏); 4.CPU.显卡过热; 5.分辨率异常; 解决方法: 一.黑屏不一定是由于鲁大师引起的,可尝试重新开机,检查各硬件是否运行正常!若无法开机,请检查视频设备(显卡.显示器)连接,重新插拔内存,直至电脑可以正常开机. 二.如果是鲁大师启动后黑屏,那么鲁大师让安装/更新什么显卡驱动,千万不要更新或者安装.因为你的系统里面的驱动

cf2.0更新后黑屏如何解决?cf2.0更新后短暂黑屏官方问题处理办法

1.我们进入到cf2.0游戏中,然后点击"设置"界面打开如图所示 2.然后在进入到的"设置"界面的"选择分辨率"我们把它设置为1024x768(普通)分辨率. 短暂黑屏问题就解决了,出现此问题是因为游戏分辨率如果我们进入是800x600和1280x800就会有问题所以小编在上面进行分辨率设置即可解决了,也是官方解决办法.

Windows7开机桌面黑屏故障终极解决方案

相信微软的解释,Windows7开机黑屏并不是由微软补丁导致的,能确定是由各种流氓软件或者病毒木马引起的,这不,网友"及时雨"就碰到了-- 症状是这样的:Windows7已经获得正版授权,从开机一直到登录用户,一切正常,但就在我们等待桌面出现的时候,小7和我们开了个玩笑,华 美的桌面并没有出现,取而代之的是黑色的屏幕,鼠标指针,和右下角的输入法框框.必须打开任务管理器,输入"explorer",才能进入桌面. 本人出现这问题的时候,上网搜索"Windows

电脑黑屏的原因

电脑黑屏是比较容易出现的现象,尤其在一些较老的电脑或组装电脑中.电脑黑屏的故障原因有多种,如显示器损坏.主板损坏.显卡损坏.显卡接触不良.电源损坏.cpu损坏.零部件温度过高等.也有的是人为的造成电脑黑屏,如微软中国的正版验证."电脑黑屏"事件 2008年10月15日微软内部邮件,微软将针对中国市场在20日启动Windows XP专业版及Office的正版验证计划,届时,安装了盗版Windows XP专业版的电脑将被强行每小时"黑屏"(桌面背景变为纯黑色)一次,Of

win7纯净版系统开机进入桌面后显示黑屏的原因以及解决方法

  开机黑屏原因分析: 出现这样的故障有可能是驱动问题,但是很多用户发现升级主板 BIOS 和显卡驱动后问题仍然没解决的话,那么就很有可能是各种流氓软件或病毒木马的原因导致的. 解决措施: 1.首先重新启动计算机,然后在启动时按下F8键进入安全模式,在多模式启动菜单出现后,用方向键选择"SafeMode",用安全模式来启动计算机; 2.启动完成之后,打开开始菜单中的运行对话框,regedit.exe命令后,回车打开注册表编辑器; 3.然后依次展开并定位到[HKEY_CURRENT_US

电脑黑屏是什么原因

  对于一些较老或组装的电脑,黑屏是比较容易出现的故障.电脑出现黑屏的硬件原因有多种,例如,显示器损坏.显卡损坏.显卡接触不良等.要排除黑屏故障,应采用排除.替换相结合的方法,其基本原则是先替换可疑性最大的电脑部件,可以按下列步骤分析故障原因. 电脑黑屏原因:硬件篇 一.检查电脑部件是否安插入牢靠 首先请检查显示器电缆是否牢固可靠地插入到主机接口中,然后再检查显卡与主板I/O插槽之间的接触是否良好.如有必要,请将显卡取下,重新安插一次,确保安插到位,接触良好. 二.确认显示器是否损坏 如果显示器