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: 16691213Received sys.powerctl='reboot,autotesttool' from pid: 1259 (system_server) ---> init进程接收到sys.powerctl属性的改变
  • init 25: 1669213Reboot start, reason: reboot,autotesttool, reboot_target: autotesttool ---> init进程开始执行DoReboot函数
  • init 18: 1669213Reboot ending, jumping to kernel ---> init进程执行RebootSystem函数进入内核态
  • reboot: Restarting system with command 'autotesttool' --->kernel进行restaring重启操作?
相关推荐
爱笑鱼2 小时前
Binder(八):远端进程死了,BinderProxy 为什么还能收到通知?
android
Android-Flutter2 小时前
Kotlin 冷流与热流详解
android·kotlin
zhangphil2 小时前
Android ContentProvider/ContentResolver读图片,跨进程 IPC慢
android
yueqc13 小时前
Android .so 文件压缩
android·so·包体积
龚礼鹏3 小时前
深入解析 Android Automotive (AAOS) 启动流程与 CarService 核心机制(基于 Android 16 最新源码视角)
android
rosmis3 小时前
agent各指标定义
android·java·开发语言
风样滴男人哟4 小时前
PHP特性之反射类ReflectionClass机制
android·开发语言·php
小孔龙5 小时前
RenderNode 与 DisplayList:Android 硬件加速的绘制记录与复用
android·性能优化
qizayaoshuap6 小时前
鸿蒙 ArkTS 实战:搜索列表 城市实时过滤(示例 94)
android·华为·harmonyos
朝星6 小时前
Framework筑基之Handler消息机制5(应用层)
android