reboot命令直接重启-sys.powerctl

本文详细解析了Android设备重启流程,特别是由设备所有者请求重启的情况。通过分析系统日志,探讨了从命令行到内核的重启过程,包括zygote进程启动、last_kmsg信息、PowerManager API调用等关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


参考另外一篇
android O 手机关机流程与时间
https://blog.youkuaiyun.com/lei7143/article/details/80499881

//开机动画

03-20 16:51:18.144364   222  2483 I boot    : BOOTPROF:BootAnimation:Start:9486833

//zygote 正常启动

03-20 16:51:21.637916   413   413 D AndroidRuntime: >>>>>> START com.android.internal.os.ZygoteInit uid 0 <<<<<<

03-20 16:51:21.657699   413   413 D AndroidRuntime: CheckJNI is OFF

//重启结束

03-20 16:50:40.558134   804   804 D RunningBoosterService: reboot complete

以上log  说明kernel 重启了,但zygote 只启动一次,说明zygote正常。

//last_kemsg 信息

[ 1537.076033]  (0)[1:init]reboot: Restarting system with command 'deviceowner'

[ 1537.076060] -(0)[1:init]machine_restart, arm_pm_restart(  (null))

[ 1537.076074] -(0)[1:init]ARCH_RESET happen!!!

[ 1537.076087] -(0)[1:init]arch_reset: cmd = deviceowner

[ 1537.076106] -(0)[1:init]CPU: 0 PID: 1 Comm: init Tainted: G        W      3.18.35+ #2

[ 1537.076118] Backtrace: 

[ 1537.076157] -(0)[1:init][<c010badc>] (dump_backtrace) from [<c010bc7c>] (show_stack+0x18/0x1c)

由于重启log中没有任何关于16:51 左右关机log信息,说明手机没有关机突然重启,由于没有uart log ,唯一的log信息是last_kmsg.

[ 1537.076033]  (0)[1:init]reboot: Restarting system with command 'deviceowner'    说明命令deviceowner使得手机突然重启

 //之前last_kmsg

<< /proc/last_kmsg >>:
ram console header, hw_status: 0, fiq step 0.
Not Clear, old status is 0.

//16:51左右last_kmsg 
<< /proc/last_kmsg >>:
ram console header, hw_status: 2, fiq step 0.
Not Clear, old status is 2.

这一次的状态是2 说明手机异常重启。

frameworks\base\core\java\android\os\PowerManager.java

/**
 * The value to pass as the 'reason' argument to reboot() when device owner requests a reboot on
 * the device.
 * @hide
 */
public static final String REBOOT_REQUESTED_BY_DEVICE_OWNER = "deviceowner";

frameworks\base\services\devicepolicy\java\com\android\server\devicepolicy\DevicePolicyManagerService.java

public void reboot(ComponentName admin) {
    Preconditions.checkNotNull(admin);
    // Make sure caller has DO.
    synchronized (this) {
        getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
    }
    long ident = mInjector.binderClearCallingIdentity();
    try {
        // Make sure there are no ongoing calls on the device.
        if (mTelephonyManager.getCallState() != TelephonyManager.CALL_STATE_IDLE) {
            throw new IllegalStateException("Cannot be called with ongoing call on the device");
        }
        mInjector.powerManagerReboot(PowerManager.REBOOT_REQUESTED_BY_DEVICE_OWNER);
    } finally {
        mInjector.binderRestoreCallingIdentity(ident);
    }
}

frameworks\native\services\powermanager\IPowerManager.cpp

  if (!property_setter_->SetProperty(ANDROID_RB_PROPERTY,

                                     kRebootPrefix + reason_str)) {

    return UNKNOWN_ERROR;

  }

\system\nativepower\...

init.rc

on property:sys.powerctl=*

powerctl ${sys.powerctl}

system/core/init/builtins.cpp 

system/core/init/builtins.cpp

static int do_powerctl(const std::vector<std::string>& args) {

system/core/libcutils/android_reboot.c

int android_reboot

Kernel/kernel/reboot.c

void kernel_restart(char *cmd)
{
 kernel_restart_prepare(cmd);
 migrate_to_reboot_cpu();
 syscore_shutdown();
 if (!cmd)
  pr_emerg("Restarting system\n");
 else
  pr_emerg("Restarting system with command '%s'\n", cmd);

参考:

linux reboot流程,从命令行到内核全解析_xh.wang的博客-优快云博客

<think>好的,我现在需要帮助用户解析Android高通平台的未知重启问题,特别是关于POWERUP_REASON、POWERUP_REASON_DETAIL和POWEROFF_REASON 0x80040的日志。首先,用户之前的问题是关于如何搜索异常重启的关键字,现在他进一步询问具体日志的解析方法,并提到了这些特定的电源相关原因代码。 我需要回顾之前的对话,确保回答的连贯性。上一次我提供了需要搜索的关键字和日志抓取方法,现在用户需要更深入的分析这些特定字段的含义。首先,我应该确认高通平台中这些电源原因代码的具体定义,因为不同的芯片组可能有不同的编码。 用户提到的POWERUP_REASON、POWERUP_REASON_DETAIL和POWEROFF_REASON 0x80040,这些都是高通芯片中用于记录启动和关机原因的寄存器或日志字段。0x80040这样的十六进制值需要转换为二进制来分析每一位的含义,可能对应不同的硬件模块或事件触发,比如看门狗、过热、电源键长按等。 接下来,我需要结合用户提供的引用内容,特别是引用[1]到[4]中提到的关机流程和系统调用,说明这些原因代码如何与系统行为关联。例如,如果重启是由看门狗触发的,日志中可能会有相关的subsys-restart或Watchdog bark条目,同时POWERUP_REASON可能对应某个特定位被置位。 还要考虑如何解析这些日志,用户可能需要使用高通的工具如QPST或QXDM来获取更详细的诊断信息,或者通过adb命令提取last_kmsg和tombstones日志。此外,需要指导用户如何将十六进制代码转换为具体的原因,可能需要参考高通的文档或头文件,比如在PMIC(电源管理集成电路)相关的文档中查找定义。 另外,用户的问题涉及到unknown reboot,这意味着标准日志中没有明确的原因,这时候需要结合多个日志源,如内核日志、系统事件日志、Modem日志等,综合分析。例如,POWEROFF_REASON 0x80040可能对应某个特定的硬件错误,需要查看硬件错误日志或传感器数据。 最后,需要确保回答结构清晰,分步骤说明如何解析这些字段,并提供相关工具和命令示例,帮助用户实际操作。同时,生成的相关问题要引导用户进一步排查可能的原因,比如硬件故障或特定子系统崩溃。</think>针对Android高通平台的未知重启问题分析,需重点关注电源状态寄存器(POWERUP_REASON/POWERUP_REASON_DETAIL)和关机原因代码(POWEROFF_REASON 0x80040),结合以下关键点进行日志解析: --- ### 一、电源状态寄存器解析 #### 1. **POWERUP_REASON**(启动原因寄存器) - **硬件级触发标志**:记录芯片组PMIC(Power Management IC)检测到的开机触发源 - **典型值分析**: - `0x1`:电源键长按(硬件触发) - `0x2`:USB充电唤醒 - `0x4`:RTC闹钟唤醒 - `0x8`:看门狗复位(需结合`subsys-restart`日志)[^1] #### 2. **POWERUP_REASON_DETAIL**(启动细节寄存器) - **二级触发分析**:补充说明具体触发模块 - `0x10000`:APSS(应用处理器子系统)触发 - `0x20000`:Modem子系统触发 - `0x40000`:WLAN/BT子系统触发 - **示例**:`POWERUP_REASON_DETAIL=0x20100`表示Modem异常导致APSS复位[^2] #### 3. **POWEROFF_REASON 0x80040** - **十六进制解析**:展开为二进制`1000 0000 0000 0100 0000`,按位分析: - **Bit19(0x80000)**:硬件看门狗超时 - **Bit6(0x40)**:PMIC过温保护触发 - **典型场景**:芯片温度超过阈值导致强制关机[^3] --- ### 二、日志关联分析方法 #### 1. **内核日志交叉验证** ```bash adb shell dmesg | grep -E "PMIC|WDG|THERMAL" ``` - 匹配`THERMAL: Critical temperature reached`确认过温保护 - 匹配`qcom,wdog`查看看门狗喂狗记录 #### 2. **高通子系统日志** - **SSR(SubSystem Restart)事件**: ```bash adb logcat | grep "subsys_name=modem" # 基带异常重启 ``` - **SMEM日志**:通过高通工具QXDM抓取`SMEM Dump`,定位PMIC错误码[^4] #### 3. **电源管理服务日志** - **Init进程日志**: ```bash adb logcat -b events | grep "boot_reason" ``` 匹配`last_poweroff_reason=0x80040`确认关机原因 - **PowerManagerService**: 检查`ShutdownThread`调用栈: ```java // 代码片段对应引用[2] PowerManagerService.lowLevelReboot(reason); ``` --- ### 三、异常场景对照表 | 现象 | 关键日志组合 | 根本原因 | |---------|--------------|----------| | 过热重启 | `POWEROFF_REASON 0x80040` + `THERMAL: shutdown` | 散热异常或CPU负载过高 | | 看门狗复位 | `POWERUP_REASON 0x8` + `KERNEL: Watchdog bark` | 子系统未及时喂狗 | | Modem崩溃 | `POWERUP_REASON_DETAIL 0x20000` + `SSR: modem` | 基带固件/信号问题 | --- ### 四、深度排查工具 1. **QPST Configuration** 使用`QCAT`分析QXDM抓取的`PMIC Log`,查看电压/温度曲线 2. **APSS Ramdump** 通过`adb pull /sys/fs/pstore/console-ramoops`获取崩溃瞬间内存快照 3. **寄存器直接读取** ```bash adb shell "echo 0x80040 > /sys/kernel/debug/pmic_dbg/reg && cat /sys/kernel/debug/pmic_dbg/reg" ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值