Android 关机(reboot)流程

Base On Android 4.2

recovery 和 reboot流程

part 1.

reboot recovery流程。

1,RecoverySystem.java中

private static File RECOVERY_DIR = new File("/cache/recovery");

private static File COMMAND_FILE = new File(RECOVERY_DIR, "command");

pm.reboot("recovery");

=》PowerManager.java

public void reboot(String reason) {

try {

mService.reboot(false,
reason, true);

} catch (RemoteException e) {

}

}

mService就是PowerManagerService.java的实例

因为

public final class PowerManagerService extends IPowerManager.Stub

=>PowerManagerService.java

reboot(){

shutdownOrRebootInternal(false, confirm, reason, wait);

}

private void shutdownOrRebootInternal(final boolean shutdown, final boolean confirm,

final String reason, boolean wait) {

ShutdownThread.reboot(mContext, reason, confirm);

}

=>

ShutdownThread.java

public static void reboot(final Context context, String reason, boolean confirm) {

mReboot = true;

mRebootSafeMode = false;

mRebootReason = reason;

shutdownInner(context, confirm);

}

shutdownInner

-》

beginShutdownSequence

拿两个wake_lock让系统不待机,让屏幕常亮

然后

sInstance.start();这个ShutdwonThread的实例start.即调用其的run方法

在run方法中,关掉am,radio....之后,调用

rebootOrShutdown

-》

public static void rebootOrShutdown(boolean reboot, String reason)

-》

PowerManagerService.lowLevelReboot(reason);

又调回PowerManagerService了。

->PowerManagerService中

lowLevelReboot()

SystemProperties.set("sys.powerctl", "reboot," + reason); //就传给Kernel进入reboot了

=》

那么接下来,走到哪里去了?

参考 :

KK 以后 Google 将关机/重启的最后转移到了init 进程上执行。 其他Process 通过system property sys.powerctl 通知init 执行。

sys.powerctl 的配置在init.rc 当中,可以参考

on property:sys.powerctl=*

powerctl ${sys.powerctl}

然后执行system/core/init/builtins.c#do_powerctl 函数,call android_reboot 重启或者关机。

为何工厂模式下无法adb reboot ? 正常情况下adb reboot 可以重启, 其关键就是因为mediatek/config/{platform}factory_init.rc 中没有定义

on property:sys.powerctl=*

powerctl ${sys.powerctl}

如果要添加此功能,只有在factory_init.rc 中添加这两行即可

继续跟

=》在init.rc中和一个相关的on 触发器

396 on property:sys.powerctl=*

397     powerctl ${sys.powerctl}

=》会调用 builtins.c 的,参考间reboot,recovery

int do_powerctl(int nargs, char **args)

=>

return android_reboot(cmd, 0, reboot_target);

cmd = ANDROID_RB_RESTART2 //在android_reboot.h中#define ANDROID_RB_RESTART2 0xDEAD0003

reboot_target =第二个参考recovery

=》

/system/core/libcutils/android_reboot.c 中的执行android_reboot();

case ANDROID_RB_RESTART2:

121             ret = __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,

122                            LINUX_REBOOT_CMD_RESTART2, arg); //arg = recovery

=>

这个在bionic/libc/include/sys/reboot.h中定义的。说明这是一个标准的系统调用

extern int __reboot(int, int, int, void *);

具体位于bionic/libc/arch-arm/syscalls/__reboot.S

1 /* autogenerated by gensyscalls.py */

2 #include <asm/unistd.h>

3 #include <linux/err.h>

4 #include <machine/asm.h>

5

6 ENTRY(__reboot)

7     mov     ip, r7

8     ldr     r7, =__NR_reboot

9     swi     #0

10     mov     r7, ip

11     cmn     r0, #(MAX_ERRNO + 1)

12     bxls    lr

13     neg     r0, r0

14     b       __set_errno

15 END(__reboot)

=》最后会进入Kernel

kernel/sys.c

case LINUX_REBOOT_CMD_RESTART2:

if (strncpy_from_user(&buffer[0], arg, sizeof(buffer) - 1) < 0) {

ret = -EFAULT;

break;

}

buffer[sizeof(buffer) - 1] = ‘\0‘;

kernel_restart(buffer);  //buffer = arg= recovery

break;

=>machine_restart()

=>arch/arm/kernel/process.c

void machine_restart(char *cmd)

{

local_irq_disable();

smp_send_stop();

/* Flush the console to make sure all the relevant messages make it

* out to the console drivers */

arm_machine_flush_console();

arm_pm_restart(reboot_mode, cmd);

/* Give a grace period for failure to restart of 1s */

mdelay(1000); // 1s之内没有restart完成就reboot失败。

/* Whoops - the platform was unable to reboot. Tell the user! */

printk("Reboot failed -- System halted\n");

local_irq_disable();

while (1);

}

=》

void (*arm_pm_restart)(char str, const char *cmd) = arm_machine_restart;

=》

void arm_machine_restart(char mode, const char *cmd)

{

...

aml_write_reg32(P_AO_RTI_STATUS_REG1, reboot_reason); //这一个标志寄存器

...

arch_reset(mode, cmd); // mode = ‘h‘ cmd = "recovery"

}

差不多了,尝试就如此吧。

那么有必要了解这个寄存器P_AO_RTI_STATUS_REG1在下次启动的时候,uboot是什么时候读。这就可以实现一些关机之后的状态保存。

时间: 2024-11-06 23:18:40

Android 关机(reboot)流程的相关文章

android 电池(二):android关机充电流程、充电画面显示【转】

本文转载自:http://blog.csdn.net/xubin341719/article/details/8498580 上一篇我们讲了锂电池的充放电的流程和电池的一些特性,这一节我们重点说一下android关机充电是怎么.充电画面显示是怎么实现的,这个在工作中也比较有用,我们开始做这一块的时候也走了不少的弯路.我记得我们做adnroid2.3的时候,关机状态和充电logo显示是在uboot中做的.应该是有两种做法,回头我再看下uboot中做画面显示那一块是怎么做的,这一节我们重点说系统中的

Android 长按电源键关机整个流程小学习

最近研究了一下android关机跟重新启动功能,看了一些长按电源键到弹出关机对话框,到真正关机的一系列处理过程. 首先还是来看看这个长按电源键都干了些什么吧?一般来说,电源键都是接到PMU上的,PMU来判断是长按还短按,当有按键消息产生的时候,系统会有中断,然后去读PMU的状态就可以知道是什么了.笔者以全志平台的AXP209小议一下,先贴上关键代码: static int axp_battery_event(struct notifier_block *nb, unsigned long eve

android reboot流程视图

下面是android简单的reboot流程视图 下面是源码分析 从Java层的ShutdownThread.java的shutdown()开始: frameworks/base/services/java/com/android/server/power/ShutdownThread.java 发出shutdown的广播,这个很重要,要通知所有应用我要关机了. [java] private static void beginShutdownSequence(Context context) {

【转】Android kernel启动流程

;font-family:Arial, Console, Verdana, 'Courier New';line-height:normal;white-space:normal;background-color:#FFFFFF;"> linuxandroidmakefileimagecachealignment 虽然这里的Arm Linux kernel前面加上了Android,但实际上还是和普遍Arm linux kernel启动的过程一样的,这里只是结合一下Android的Makef

深入解析Android关机

下图详细阐释了Android的关机顺序. 第一步: 按住电源按钮半秒钟(500ms). 第二步: 之后,PhoneWindowManager.java 将捕获长按电源按钮这一事件并调用"interceptKeyBeforeQueueing"方法. 下面是处理长按电源键事件的代码片段 1 /** {@inheritDoc} */ 2 @Override 3 public int interceptKeyBeforeQueueing(KeyEvent event, int policyFl

Android -- Wifi连接流程分析

Android -- Wifi连接流程分析 当我们在Android手机上连接一个AP时,间接调用WifiManager的connect()方法: /** * Connect to a network with the given configuration. The network also * gets added to the supplicant configuration. * * For a new network, this function is used instead of a

Android技术20:Android的初始化流程

Android系统是如何启动的呢,应用程序是如何启动.下面简要介绍下初始化流程. 1.Android系统的初始化 1.1Android系统会首先启动Linux基础系统,然后引导加载Linux内核并启动初始化进程Init Linux Kernel---->Init(pid=1) 1.2启动守护进程Daemons 启动Usb守护进程,管理USB连接 启动Android Debug Bridge守护进程管理ADB连接 启动Debuggerd Debug守护进程 启动无线接口守护进程管理无线通信 1.3

Android WIFI 启动流程(TIP^^)

前几天因为解决一堆Bug,没时间写.我不会每天都写,就是为了存档一些资料. 内容来源:工作中接触到的+高手博客+文档(Books)=自己理解 仅限参考^^ 此博客是上一个<<Android WIFI 启动流程>>的附加项. 参考博客:http://blog.csdn.net/eoeandroida/article/details/40583353 配置AP: 当用户在WifiSettings界面上选择了一个AP后,会显示配置AP参数的一个对话框. showAccessPointDi

Android 之MediaScanner流程解析

MediaScanner详解 OK, 我们现在开始来大概分析一下android framework中MediaScanner部分的流程,若大家发现分析过程中有错误,欢迎拍砖指正. 分析流程之前,我们先给自己定个要用MediaScanner解决的问题,这样我们才会有目标感,才知道我们要干什么.否则,干巴巴的分析流程,一般都会很容易的迷失在各种code的迷雾中. 我们这里要定的目标是:获取某个MP3文件的artist & album. 我们可以假定,现在有个媒体播放器,在播放music的时候,需要在