zoukankan      html  css  js  c++  java
  • SWT 手机重启问题分析指南

    极力推荐文章:欢迎收藏
    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 可能会引起手机重启。
    搜索关键字
    dumpStackTraces

    dumpStackTraces 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,领福利

  • 相关阅读:
    人月神话--没有银弹软件工程中的根本和次要问题(No Silver Bullet Essence and Accident in Software Engineering)
    人与人之间最难得是合作,组件与组件之间最难得时协作。
    关注软件构架与软件构架师
    软件产品本质是逻辑或者说事概念产品
    为什么需求分析离不开系统逻辑模型
    MySQL中varchar最大长度是多少?【转】
    WCF自定义授权[转自小庄的博客]
    PetShop的系统架构设计[转]
    百练 2734 十进制到八进制 解题报告
    百练 2818 密码
  • 原文地址:https://www.cnblogs.com/wangjie1990/p/11326910.html
Copyright © 2011-2022 走看看