You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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 rebootadb shell reboot的核心差异

这两个命令看似相似,但执行流程、代码实现和功能范围完全不同:

  • 执行路径不同
    • adb reboot:是电脑端的adb客户端直接给设备上的adbd进程发重启指令,adbd会直接调用系统重启接口(比如reboot()系统调用,或者给init进程发重启消息),全程不经过设备上的用户空间reboot工具。
    • adb shell reboot:先通过adb建立shell连接,然后在设备的shell环境下执行/system/bin/reboot这个独立程序,由它来处理重启逻辑和参数。
  • 参数支持能力不同
    • adb reboot的参数很有限,只能识别预定义的重启模式,比如recoverybootloadersideload等,不支持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 rebootadbd进程执行,adbd本身权限很高(通常是root或shell权限),流程更短,直接和系统底层交互。
    • adb shell reboot是在shell进程下执行reboot程序,需要reboot程序拥有setuid root权限,流程多了shell调用和用户空间程序执行的环节。

内容的提问来源于stack exchange,提问作者Mars Yeh

火山引擎 最新活动