Android Init 系列专题【篇六:reboot & shutdown】

在android系统中,init进程不仅仅作为第一个进程,涉及设备的开机流程,其实android系统的关机和重启流程,也都离不开init。本篇以android系统的关机/重启流程为切入点,重点来介绍一下init进程在这个过程中是如何举足轻重。

在android系统中,让系统重启或者关机的方式有多种,这里介绍一下常用的手段:

  • 长按电源键
  • 调用PowerManager的reboot或者shutdown方法
  • 发送Intent.ACTION_REQUEST_SHUTDOWN系统广播
  • 执行reboot或者poweroff命令
  • 设置sys.powerctl属性

虽然有如上众多方式让系统重启或者关机,但大部分方式在native init层其实是通过sys.powerctl属性的方式来完成系统的重启或者关机,这里先以一个案例的日志来进行说明:

bash 复制代码
[  166.920846] <0>.(0)[311:init]init 27: [166912][13]Received sys.powerctl='reboot,autotesttool' from pid: 1259 (system_server)
[  166.926731] <2>.(2)[1:init]init 18: [166921][3]Got shutdown_command 'reboot,autotesttool' Calling HandlePowerctlMessage()
[  166.940250] <1>.(1)[1:init]init 25: [166921][3]Reboot start, reason: reboot,autotesttool, reboot_target: autotesttool
[  166.941877] <1>.(1)[1:init]hang_detect: init set reboot command.
[  166.942734] <1>.(1)[1:init]init 25: [166921][3][HANG_DETECT] set hang detect reboot flag.
[  166.945487] <1>.(1)[1:init]init 25: [166921][3]Create reboot monitor thread.
[  167.024221] <3>.(3)[311:init]init 27: [167012][5]ReapLogC PropSet [sys.powerctl]=[reboot,autotesttool]166917 [init.svc.vendor.volte_ua]=[stopping]166918 [init.svc.vendor.volte_ua]=[stopped]166921 [init.svc_debug_pid.vendor.volte_ua]=[]166921 [persist.sys.boot.reason]=[reboot,autotesttool]166966 [vendor.volte_md_status]=[stop]166967 [vendor.mdl.reset_md]=[1]166967 [init.svc.blank_screen]=[running]166975 [ro.boottime.blank_screen]=[166972756317]166975 [init.svc_debug_pid.blank_screen]=[2914]166977 [vendor.mtk.md1.status]=[flightmode]166978 [init.svc.nvram-hidl-1-1]=[stopping]166997 [init.svc.vendor.wifi_hal_legacy]=[stopping]167000 [init.svc.vendor.vibrator-default]=[stopping]167006 [init.svc.vendor.ril-daemon-mtk]=[stopping]167012 [init.svc.vendor.volte_stack]=[stopping]167019 Done
[  171.072287] <1>.(1)[1:init]init 25: [166921][3]Service vold has 'reboot_on_failure' option and failed, shutting down system.
[  174.747922] <0>.(0)[1:init]init 18: [166921][3]Reboot ending, jumping to kernel
[  175.062840] <0>-(0)[1:init][<c015da6c>] (kernel_restart) from [<c015df0c>] (sys_reboot+0x194/0x218)
[  175.064855] <0>-(0)[1:init][<c015df0c>] (sys_reboot) from [<c0101000>] (ret_fast_syscall+0x0/0x54)
[  175.102453] <0>-(0)[1:init][<c015da6c>] (kernel_restart) from [<c015df0c>] (sys_reboot+0x194/0x218)
[  175.104467] <0>-(0)[1:init][<c015df0c>] (sys_reboot) from [<c0101000>] (ret_fast_syscall+0x0/0x54)
[  175.159437] <0>-(0)[1:init][<c015da6c>] (kernel_restart) from [<c015df0c>] (sys_reboot+0x194/0x218)
[  175.161453] <0>-(0)[1:init][<c015df0c>] (sys_reboot) from [<c0101000>] (ret_fast_syscall+0x0/0x54)
[  175.228705] <0>.(0)[1:init]reboot: Restarting system with command 'autotesttool'

如上每一行日志的都是非常关键,这个案例是autotesttool自动化测试工具在压测过程中通过设置属性sys.powerctl='reboot,autotesttool'方式来对系统进行重启。主要关键日志如下:

  • init 27: [166912][13]Received sys.powerctl='reboot,autotesttool' from pid: 1259 (system_server) ---> init进程接收到sys.powerctl属性的改变
  • init 25: [166921][3]Reboot start, reason: reboot,autotesttool, reboot_target: autotesttool ---> init进程开始执行DoReboot函数
  • init 18: [166921][3]Reboot ending, jumping to kernel ---> init进程执行RebootSystem函数进入内核态
  • reboot: Restarting system with command 'autotesttool' --->kernel进行restaring重启操作?
相关推荐
sTone873753 小时前
Android核心概念(一)minSdkVersion targetSdkVersion compileSdkVersion
android·前端
wuweikai06173 小时前
在Android设备上打开Perfetto调试日志开关
android·性能优化·perfetto
Meteors.3 小时前
安卓进阶——多媒体
android
正经教主4 小时前
【App开发】Mumu模拟器安装使用与Android Studio连接指南
android·ide·android studio
Larry_zhang双栖4 小时前
Flutter Android Kotlin 插件编译错误完整解决方案
android·flutter·kotlin
wuwu_q5 小时前
彻底讲清楚 Kotlin 的 when 表达式
android·开发语言·kotlin
木易 士心6 小时前
Android 开发核心技术深度解析
android·开发语言·python
QING6186 小时前
Jetpack Compose 条件布局与 Layout 内在测量详解
android·kotlin·android jetpack
一念杂记6 小时前
没网太崩溃!手机电脑网络共享,简单几步搞定网络共享,再也不用为没网担忧~
android·windows