本篇文章主要介绍 ​​Android​​ 开发中的 关机 部分知识点,

1.如何初步定位异常关机问题


1.如何初步定位异常关机问题

由于异常关机问题可能存在多种可能性(异常重启,异常关机,hang机,掉电),请务必厘清复现过程和手法,保留问题现场,以下信息请在提case的时候一起提供:

  • 1 . 确认是亮屏关机还是灭屏关机?关机时是否有播放关机动画?

如果有播放关机动画可以检查关机流程的调用是否有异常。

  • 2 . 是直接关机还是关机后会自动重启?

可以检查log中是否有走ShutdownThread或者reboot流程,是否有对应的exception或db产生。

  • 3 . 异常关机时,连上uart线是否可以吐log?插上usb后是否能显示关机充电动画?

如果可以吐log,可以通过log判断是hang机还是关机充电;若能正常显示关机充电动画可以确认之前的行为是关机而不是hang机。

  • 4 . 如果按Powerkey可以重新开机,请注意按powerkey的时长是多少?

如果是关机,按Powerkey 2~4s即可重新开机;如果是Hang机,按Powerkey要8s以上才会强制掉电重启。

  • 5 . 检查log中的Battery电压等信息,判断是否为低电或者电压波动异常大?

在 events_log 中 搜索关键字 battery_level,查看电池电量、电压、温度信息​​04-20 17:18:49.211290 1035 1035 I battery_level: [37(电量),3682(电压),280(电池温度)]​

  • 6 . 检查log中的Thermal信息,是否有电池温度或者板温过60度的情况?

同上5


  • 7 . 如果是电池本身的过流/过压保护,异常关机后按Powerkey不能重启,必须要拔插电池才能恢复。
  • 8 . 提供的log中请包括关机mobile log(最好能抓logcat和uart log),关机后再开机的mobile log(包括pl_lk log、kernel_log.boot、main_log.boot、last_kmsg、property、cmdline等信息),如果有exception信息请一并提供对应db文件。


  1. Android O 之后log提供注意事项

Android O 中 mtklog 和db 不在同一个目录,提交log 时需要同时导出来:

adb pull /sdcard/mtklog
adb pull /data/aee_exp
adb pull /data/vendor/mtklog/aee_exp

2.关机流程上层浅析

MTK 平台关机线程类​​frameworks/base/services/core/java/com/android/server/power/ShutdownThread.java​​​继承ShutdownThread 线程类:​​vendor/mediatek/proprietary/frameworks/base/services/core/java/com/mediatek/server/MtkShutdownThread.java​

1. Google 原生ShutdownThread实现

ShutdownThread 浅析总结


ShutdownThread 浅析总结

ShutdownThread 类主要方法概览


ShutdownThread 类主要方法

部分静态变量如下:


部分静态变量

关机线程大致步骤


关机线程大致步骤

ShutdownThread Run 方法实现


Run 方法实现

发送关机广播


发送关机广播

关闭Activity Manager


关闭Activity Manager

关闭PackageManager


关闭PackageManager

关闭Radios


关闭Radios

关闭StorageManagerService


关闭StorageManagerService

关闭 StorageManager


关闭 StorageManager

播放关机动画,SystemServer 关闭结束


播放关机动画,SystemServer 关闭结束

关机完成震动,实现真正意义上的关机


关机完成震动

shutdown 构造方法 概览


shutdown 构造方法 概览

shutdown 构造方法


shutdown 构造方法

shutdownInner方法


shutdownInner方法

CloseDialogReceive


CloseDialogReceiver

beginShutdownSequence


beginShutdownSequence

关机进度条弹框showShutdownDialog


关机进度条弹框showSutdownDialog

Reboot 构造方法


Reboot 构造方法

重启进入安全模式 rebootSafeMode


重启进入安全模式 rebootSafeMode


  1. MtkShutdownThread

MTK 平台关机自定义 继承ShutdownThread 线程类:​​vendor/mediatek/proprietary/frameworks/base/services/core/java/com/mediatek/server/MtkShutdownThread.java​


MtkShutdownThread 继承关系

MtkShutdownThread 概览


MtkShutdownThread 概览

MtkShutdownThread 大致概览总结


MtkShutdownThread 大致概览总结

MTK 重写shutdownAnimationService方法


MTK 重写shutdownAnimationService方法

关闭背光灯 setBacklightOff


关闭背光灯 setBacklightOff

delayForPlayAnimation


delayForPlayAnimation

重写 showCustomizedShutdownAnimation


重写 showCustomizedShutdownAnimation

Runnable mDelayDim


Runnable mDelayDim

bootanimCust 方法


bootanimCust 方法

startBootAnimation


startBootAnimation

重写 customizedShutdownSequence


重写 customizedShutdownSequence