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.

[email protected]

201505221140

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-03 13:46:19

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

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

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

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

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

Android中Google Drive显示黑屏问题分析

一.问题现象 在contacts中添加一个新的联系人,为新的联系人选择一个icon,在弹出的documents窗口中选择drive,在drive中选择一个图片,然后出现一段时间的黑屏. Platform:MT6572 Android版本:4.4KK BuildType:user 系统软件版本:SWC9G+UAG0 系统RAM:512M 二.关键log以及相关代码 三.问题初步分析 四.建议的问题解决方案 完整的分析流程请直接下载PDF文档: Drive_show_black_screen_iss

cent0s7 显卡驱动导致重启黑屏

由于 CentOS7.0 版本与前面的 CentOS6.5 及之前的版本的模式变更方法有很大 的不同,以前的版本中我们可以在vi /etc/inittab 文件中将id:5:initdefault 更改为 id:3:initdefault 就可以进入文字命令模式,但是CentOS7.0 版本开始,由于 7.0 版本的 CentOS 采用的是 systemd模式,所以需要进行如下操作才可以进行切换: 从 GNOME界面变更为文字命令行模式:ln –sf /lib/systemd/system/mu

无线网卡驱动导致的黑屏卡机

今天遇到一个我不喜欢的问题,不喜欢但是还是需要解决的.其实这是一台POS机,在高峰期的时候,无缘无故的突然就重启了,我把电脑的配置查看一下,固态的硬盘,4G的内存,问题出在哪里呢?其实我也是不知道,因为没有报错或者故障你根本不知道哪里下叉? 第一天,怀疑电源的问题,换了一个电源,发现问题没有被解决 第二天,去更换了一个内存条,更换掉内存条后发现,发现问题来了,电脑开机时候能够启动,因为要使用无线网卡,所以无线网卡扫描盒,打印的都接上了,电脑也能够正常的启动,为了解决无线网卡的问题,插板两下还是没

win10电脑黑屏怎么办 教你七大解决方法

我想许多人都会像我一样,常常遇到一些电脑问题而手足无措吧.比如,电脑黑屏怎么办?那么,现在笔者和大家分享一些关于电脑黑屏产生的原因及解决办法. 电脑黑屏怎么办一:显示器 由于显示器自身的原因而不能正常工作造成的黑屏,如显示器的电源线有问题,电源插头接触不良(注意:两头都有可能),电源开关坏,显示器内部电路故障等. 电脑黑屏怎么办二:信号线 PC机使用的显示器采用的15针D形插头的连接方式,其中的第13,14针是行场同步信号,显示器通过判断这两个信号的有无来决定是否打开灯丝和高压的供电通路,同时这

Android启动黑屏白屏解决方案

在App的Splash页面启动时会出现短暂的黑屏或者白屏,会带来很不好的用户体验,究其原因是因为资源还未加载完成而导致的黑屏或白屏,而我们所看到的黑白屏其实就是顶层Window,下面总结两种解决方案. **设置Window层的界面为我们的Splash界面. <!--防止启动时黑屏,添加window图片--> <style name="Theme.AppStartLoad" parent="android:Theme"> <item na

DirectX截图黑屏的解决办法

为什么会黑屏? 一句话概括,黑屏是由于DDraw加速引起的! 先说一下DirectX的显示原理,通常我们看到的屏幕上的数据,都是通过Primary Surface送至显示器的,什么是Primary Surface呢?中文叫做主显示表面,也就是说我们当前看到的屏幕上的图像数据是从这个表面来的,除了主表面意外还有离屏表面,叫做OffScreenSuface.这种表面中的数据是不直接显示在屏幕上的.常用的截屏函数也基本上是通过截取Primary Surface中的数据来实现的.现在多数的视频播放软件都

[FMX] Android APP 启动黑屏优化补丁

使用说明 *************************************************** Android APP 启动黑屏优化补丁 作者: Swish, YangYxd 2016.01.16 Version: 1.0.0 QDAC官方群: 250530692 *************************************************** [安装方式] 双击Setup.bat安装补丁文件(安装时会作备份) 双击Uninstall.bat可以恢复. [