AOSP中不同关机命令的差异及关机速度优化咨询
全志A33上AOSP 5.1两种关机方式的差异、风险及优化方案
刚好在AOSP 5.1和全志平台折腾过类似问题,给你拆解一下这几个疑问:
一、两种关机方式的核心差异
这俩本质就是上层用户流程和底层内核指令的区别:
长按电源键的关机流程:
这是Android给用户设计的标准关机路径,步骤相当“讲究”:- SystemUI先捕获到长按电源键的事件,给SystemServer发关机请求
- SystemServer启动
ShutdownThread,先广播ACTION_SHUTDOWN给所有应用 - 所有收到广播的应用会执行收尾操作——比如保存编辑的内容、释放持有的硬件资源、同步数据到本地
- 同时SystemUI弹出带加载动画的关机对话框,让用户知道系统在“干活”
- 等应用差不多收尾完了,才调用底层HAL接口触发硬件断电
你看到的3.5-4.5秒,就是应用处理广播、系统收尾的总耗时
adb shell reboot -p的关机流程:
这是直接绕开Android上层,调用Linux内核的“硬关机”指令:reboot -p命令直接通知init进程执行关机逻辑- init会立刻给所有进程发终止信号,然后卸载文件系统,直接让内核切断电源
- 完全跳过了Android上层的广播通知、应用收尾这些步骤,所以快得像“断电”一样
二、adb reboot -p的风险肯定有,得注意
这种硬关机方式的风险主要在三个方面:
- 应用数据丢失:应用没收到关机广播,来不及保存临时数据——比如你正在编辑的备忘录、未同步的游戏存档,大概率会丢
- 文件系统损坏:如果有应用正在写入文件(比如系统日志、应用缓存),强制断电可能导致文件系统出现“脏数据”,严重的话下次开机可能需要自动修复,甚至直接开不了机
- 长期硬件损耗:虽然概率低,但存储芯片在读写过程中被强制断电,次数多了可能缩短寿命
如果是测试场景,或者确定没有正在运行的关键应用,偶尔用用没问题,但绝对不能作为日常关机方式。
三、优化常规关机速度?当然可以,改这些文件就行
要缩短长按电源键的关机时间,核心就是减少系统等待应用的时间,或者砍掉非必要的流程,给你几个可行的修改点:
1. 缩短应用处理关机广播的超时时间
AOSP 5.1里ShutdownThread默认会等应用10秒才强制关机,你可以把这个时间改短:
- 找到文件:
frameworks/base/services/core/java/com/android/server/power/ShutdownThread.java - 里面有个
MAX_SHUTDOWN_WAIT_TIME常量,默认是10*1000(10秒),改成3*1000(3秒)甚至2*1000都可以 - 注意:别改得太极端,比如1秒,不然很多应用根本来不及保存数据,得根据你的设备实际测试调整
2. 跳过非必要的系统服务停止流程
有些非核心系统服务的停止流程不影响关机,能砍就砍:
- 还是在
ShutdownThread.java的shutdown()方法里,找到发送广播后停止服务的代码块,比如停止一些第三方服务、或者像媒体扫描这类非必须的系统服务 - 比如你可以注释掉停止
MediaScannerService的代码,能省个几百毫秒
3. 简化关机对话框的动画逻辑
如果那个加载动画本身占了时间,也可以调整:
- 找到文件:
frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerUI.java - 找到
showShutdownDialog()方法,要么缩短动画时长,要么直接跳过动画(但会让用户觉得关机太突兀,体验打折扣)
4. 底层init流程优化(谨慎操作)
如果上层优化后还是不够快,可以碰一下init.rc的关机逻辑:
- 找到设备对应的init.rc文件:
device/allwinner/a33/你的设备型号/init.rc(或者通用的system/core/rootdir/init.rc) - 找到
on shutdown这个action,简化里面的操作,比如去掉一些非必要的文件系统检查步骤 - 这一步风险高,搞不好会导致系统无法正常关机,建议先在测试机上验证
最后提个醒
优化的时候一定要循序渐进,先改上层的超时时间,测试没问题再碰其他部分。每次修改后都要反复测试关机、开机,确保不会出现数据丢失、系统崩溃的情况。
内容的提问来源于stack exchange,提问作者user_1559454
相关产品推荐
相关产品推荐

