参考另外一篇
android O 手机关机流程与时间
https://blog.csdn.net/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
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);
参考: