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重启操作?
相关推荐
Doro再努力7 小时前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim
Daniel李华8 小时前
echarts使用案例
android·javascript·echarts
做人不要太理性9 小时前
CANN Runtime 运行时组件深度解析:任务调度机制、存储管理策略与维测体系构建逻辑
android·运维·魔珐星云
我命由我123459 小时前
Android 广播 - 静态注册与动态注册对广播接收器实例创建的影响
android·java·开发语言·java-ee·android studio·android-studio·android runtime
朗迹 - 张伟9 小时前
Tauri2 导出 Android 详细教程
android
lpruoyu10 小时前
【Android第一行代码学习笔记】Android架构_四大组件_权限_持久化_通知_异步_服务
android·笔记·学习
独自破碎E11 小时前
【BISHI15】小红的夹吃棋
android·java·开发语言
李堇14 小时前
android滚动列表VerticalRollingTextView
android·java
lxysbly15 小时前
n64模拟器安卓版带金手指2026
android
游戏开发爱好者818 小时前
日常开发与测试的 App 测试方法、查看设备状态、实时日志、应用数据
android·ios·小程序·https·uni-app·iphone·webview