SWT 手机重启问题分析指南

2,110 阅读2分钟

极力推荐文章:欢迎收藏 Android 干货分享

#####阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android

本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:

一、SWT 手机重启问题简介 二、SWT 手机重启问题处理流程 三、SWT 手机重启问题的原因 四、SWT 手机重启问题分析流程 五、SWT 手机重启问题分析举例 六、Android O以上导 Log 注意事项

#一、 SWT 手机重启问题简介

SWT(Software Watch Dog ) 主要用来监控SystemServer重要线程/Service 的运行情况。如果发现其阻塞超过 60s ,看门狗进程就会把系统重启,进而保证系统可以恢复到正常状态。

判断阻塞的方法

  • 1.利用 Services 注册monitor 去Check

主要是: AMSForeground Thread

    1. 发送handler 到重要的Loop 线程来Check 是否阻塞。

主要是: Main ThreadUI ThreadIO ThreadDisplay ThreadWMSOther Services

SWT 判断阻塞的方法 图文描述如下:

SWT 判断阻塞的方法

#二、 SWT 手机重启问题处理流程

SWT 处理流程: 1.每半分钟check 一次system_server 进程: 检查系统是否卡住,如果卡住,dump 一次system_serverbacktrace

2.一分钟卡住后kill,并重新计数: 如果卡住,第二次dump,并killsystem_server进程 ,否则重新计时。

3.SWT 处理大致流程如下:

SWT 处理流程

三、 SWT 手机重启问题的原因

导致 SWT重启原因的原因有很多种。

主要导致的原因如下:

检查SWT 原因分类

#四、 SWT 手机重启问题分析流程

首先搜索关键 watchdog,查看是否有重启发生。

SWT 流程分析

#五、SWT 手机重启问题分析举例

1.分析 trace ,确认线程关系

线程被 Block 搜索关键字 held by

确认线程关系

线程被 Waiting 结合代码分析。

确认线程关系

2.线程死锁

确认Block的线程是否有闭环的死锁关系。

线程死锁

线程死锁

3.Binder的Server 端卡住

线程状态 Native,并且callstack中含有一对

IPCThreadState::waitForResponse IPCThreadState::talkWithDriver 的明显特征。

Bind的Server端卡住

Bind的Server端卡住

4.SurfaceFlinger 卡住导致重启

搜索关键字 I watchdog , 查看是否有 surfaceflinger hang,默认卡住40s,就会重启。

SurfaceFlinger 卡住

5.Native 方法执行时间过长导致重启

线程状态 Native,查看是否有 PowerManagerService.nativeSetAutoSuspend

Native 方法执行时间过长

6.Zygote Fork 进程时卡住

线程状态Native,查看是否有 Process.zygoteSendArgsAndGetResult

Zygote Fork 进程时卡住
##7.Dump 时间过长

Dump 超过60s 可能会引起手机重启。 搜索关键字 dumpStackTracesdumpStackTraces process

Dump 时间过长

前面有ANR 发生

前面有ANR 发生

前面有fatal JE NE KE 等Exception发生

自动化测试脚本有call dumpsys 去dump 系统信息

#六、 Android O以上导 Log 注意事项

Android O 以上的 mtklogdb 不在同一个目录,需要执行以下adb命令 导Log.

//1. 导 MTK log 
adb pull /sdcard/mtklog
//2. 导 AEE log,如果没有,请执行第3步
 adb pull /data/aee_exp
//3.导 data 下MTK缓存 的aee log
 adb pull /data/vendor/mtklog/aee_exp

至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

微信关注公众号:  程序员Android,领福利