SystemUI 连续ANR导致的黑屏问题

本文分析了SystemUI连续出现ANR导致的黑屏问题,涉及进程异常终止、重新启动流程中的同步问题,以及高负载下System UI唤醒困难的场景。通过日志分析,发现ANR事件可能导致进程在启动过程中被错误地终止,从而引发黑屏。解决方案包括改进进程启动和ANR处理机制,确保进程完全启动后再进行ANR操作。

存在几个SystemUI启动失败导致的黑屏问题

问题1:Q项目systemui先NE后ANR,anr的时候杀了刚起的systemui,导致systemui没有启动
//先发生NE
12-17 13:35:35.559 13579 13579 F DEBUG   : pid: 4265, tid: 4265, name:ndroid.systemui  >>> com.android.systemui <<<
//后发生ANR
12-17 13:35:51.417  1321  1352 I am_anr  :[0,4265,com.android.systemui,952647181,Broadcast of Intent {act=android.intent.action.SCREEN_OFF flg=0x50200010 }]
12-17 13:36:08.463  1321  3078 V ActivityManager: Death received in com.android.server.am.ActivityManagerService$AppDeathRecipient@306636cfor thread android.os.BinderProxy@d8b6d35,mPid:4265,mApp:ProcessRecord{1ee44a6 4265:com.android.systemui/u0a62}
//NE先挂掉,所以会重启
12-17 13:36:09.001  1321  3078 I am_proc_died:[0,4265,com.android.systemui,-800,6]
12-17 13:36:09.012  1321  3078 W ActivityManager: Re-adding persistent process ProcessRecord{1ee44a6 4265:com.android.systemui/u0a62}
//收到ANR,杀进程,设置process Record中的pendingStart =false,当前的pid已经设置为0了
12-17 13:36:09.026  1321  1352 I ActivityManager: Killing 0:com.android.systemui/u0a62 (adj -800): bg anr
12-17 13:36:09.045   550   550 D Zygote  : Forked child process 13818
12-17 13:36:09.048  1321  1353 W ActivityManager: ProcessRecord{1ee44a60:com.android.systemui/u0a62} start not valid, killing pid=13818, pendingStart=false;
//启动的时候发现pendingStart被人设置为false导致handleProcessStartedLocked直接退出
12-17 13:36:09.054   550   550 I Zygote  : Process 13818 exited due to signal 9 (Killed)
//走进去的时候,app.pid为0
12-17 13:36:09.026  1321  1352 I ActivityManager: Killing 0:com.android.systemui/u0a62 (adj -800): bg anr
/////
问题根本是启动进程的时候不持锁了,此时kill了systemui异步启动进程,导致杀进程和启进程同步进行了。
修改方法:

frameworks/base/services/core/java/com/android/server/am/ProcessRecord.java
 void kill(String reason, @Reason int reasonCode, @SubReason int subReason, boolean noisy) {
       if (!killedByAm) {
           if (pid > 0) {
           ......
           }else{
            ///modify start
                if(!( mPersistent && info != null && "com.android.systemui".equals(info.packageName))) {
                    pendingStart = false;
                } else {
                    Slog.i(TAG, "Skipping set pendingStart = false for " + info.packageName);
            &nbs
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值