AOSP中执行adb reboot时如何设置persist标记?两类重启命令差异解析
嘿,我来帮你拆解这两个AOSP里adb重启相关的问题,都是实操中容易搞混的细节,给你理清楚:
如何在执行
adb reboot时设置persist标记 persist标记的核心是把重启原因持久化到设备的persist分区,让下次开机时系统能读取到这个重启原因。针对adb reboot的场景,你需要分两步操作:
- 第一步,先通过adb shell设置持久化的重启原因属性:
adb shell setprop persist.sys.reboot_reason <你的自定义原因> - 第二步,执行普通的
adb reboot命令:adb reboot
如果你想用更简洁的方式,其实可以直接用adb shell reboot带persist参数一步到位:
adb shell reboot persist,<你的自定义原因>
这种方式会直接调用设备上的/system/bin/reboot工具(也就是你找到的reboot.c编译出来的程序),它内部会自动处理persist标记,把重启原因写入persist分区后再执行重启。
adb reboot和adb shell reboot的核心差异 这两个命令看似相似,但执行流程、代码实现和功能范围完全不同:
- 执行路径不同
adb reboot:是电脑端的adb客户端直接给设备上的adbd进程发重启指令,adbd会直接调用系统重启接口(比如reboot()系统调用,或者给init进程发重启消息),全程不经过设备上的用户空间reboot工具。adb shell reboot:先通过adb建立shell连接,然后在设备的shell环境下执行/system/bin/reboot这个独立程序,由它来处理重启逻辑和参数。
- 参数支持能力不同
adb reboot的参数很有限,只能识别预定义的重启模式,比如recovery、bootloader、sideload等,不支持persist这类自定义标记的处理——因为adbd的重启逻辑里没有实现相关解析代码。adb shell reboot因为调用的是用户空间的reboot工具,支持更多扩展参数,比如-p(关机)、persist,<reason>(持久化重启原因)、自定义重启原因等,这些都是reboot.c里实现的功能。
- 代码位置不同
adb reboot的处理代码在AOSP的system/core/adb/目录下,比如adb_service.cpp里的reboot_service函数,负责接收并解析adb客户端的重启命令。adb shell reboot对应的代码就是你找到的system/core/reboot/reboot.c,这个是独立编译的用户空间工具,最终安装在设备的/system/bin目录下。
- 执行权限与流程复杂度
adb reboot由adbd进程执行,adbd本身权限很高(通常是root或shell权限),流程更短,直接和系统底层交互。adb shell reboot是在shell进程下执行reboot程序,需要reboot程序拥有setuid root权限,流程多了shell调用和用户空间程序执行的环节。
内容的提问来源于stack exchange,提问作者Mars Yeh




