Andriod关机&重启分析

1、jni层

frameworks/base/core/jni/android_os_Power.cpp

static void android_os_Power_shutdown(JNIEnv *env, jobject clazz)

{

sync();

#ifdef HAVE_ANDROID_OS

reboot(RB_POWER_OFF);

#endif

}

static void android_os_Power_reboot(JNIEnv *env, jobject clazz, jstring reason)

{

sync();

#ifdef HAVE_ANDROID_OS

if (reason == NULL) {

reboot(RB_AUTOBOOT);

} else {

const char *chars = env->GetStringUTFChars(reason, NULL);

__reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,

LINUX_REBOOT_CMD_RESTART2, (char*) chars);

env->ReleaseStringUTFChars(reason, chars); // In case it fails.

}

jniThrowIOException(env, errno);

#endif

}

static JNINativeMethod method_table[] = {

…...

{ "shutdown", "()V", (void*)android_os_Power_shutdown },

{ "rebootNative", "(Ljava/lang/String;)V", (void*)android_os_Power_reboot },

};

其中,RB_POWER_OFF 及RB_AUTOBOOT 定义bionic/libc/include/sys/reboot.h

中。

#define RB_AUTOBOOT LINUX_REBOOT_CMD_RESTART

#define RB_HALT_SYSTEM LINUX_REBOOT_CMD_HALT

#define RB_POWER_OFF LINUX_REBOOT_CMD_POWER_OFF

…...

2、通过jni层,最后会执行系统调用sys_reboot,即reboot。以imx51平台为例,reboot定义在kernel_imx/kernel/sys.c

…...

if ((cmd == LINUX_REBOOT_CMD_POWER_OFF) && !pm_power_off)

cmd = LINUX_REBOOT_CMD_HALT;

lock_kernel();

switch (cmd) {

case LINUX_REBOOT_CMD_RESTART:

kernel_restart(NULL);

break;

…...

case LINUX_REBOOT_CMD_HALT:

kernel_halt();

unlock_kernel();

do_exit(0);

break;

case LINUX_REBOOT_CMD_POWER_OFF:

kernel_power_off();

unlock_kernel();

do_exit(0);

break;

…...

其中,函数指针pm_power_off是与平台相关的指针,以imx51平台为例,其定义于kernel_imx/arch/arm/mach-mx5/mx51_baggage.c中。

static void mxc_power_off(void)

{

…...

/* Set the power gate bits to power down */

pmic_write_reg(REG_POWER_MISC, (PWGT1SPIEN|PWGT2SPIEN),

(PWGT1SPIEN|PWGT2SPIEN));

}

另外,在 static void __init mxc_board_init(void) 函数中,有

pm_power_off = mxc_power_off;

另外,在pmic中,也定义了pm_power_off = pmic_power_off;

这是因为imx51支持2中关机方式,具体要看硬件支持。

3、sys_reboot分析

当pm_power_off为空时, 由上层传入的命令LINUX_REBOOT_CMD_POWER_OFF会变为LINUX_REBOOT_CMD_HALT,从而执行kernel_halt()函数。在该函数中,会执行函数machine_halt(),其定义在kernel_imx/arch/arm/kernel/process.c中。

void machine_halt(void)

{

}

由于该函数为空,因此,当pm_power_off指针为空时,执行关机操作会失败。

当pm_power_off不为空时, 上层命令LINUX_REBOOT_CMD_POWER_OFF,执行的函数是kernel_power_off()。在该函数中,会执行函数 machine_power_off,其于machine_halt定义于同一文件中。

void machine_power_off(void)

{

if (pm_power_off)

pm_power_off();

}

因此,只有当pm_power_off指针不为空,且实现代码符合该cpu体系时,andriod才能实现正常的关机。

4、reboot

reboot较简单,通过命令LINUX_REBOOT_CMD_RESTART执行kernel_restart(NULL)即可。

更多相关文章

  1. android自定义通知栏并通过广播实现监听
  2. android 自定义软键盘
  3. Android中自定义ProgressDialog实现加载滚动条(加载中…)效果
  4. android studio 3.0配置自定义打包名称
  5. Android 发送自定义广播
  6. 自定义progressBar显示静态数据
  7. Android使用xml自定义图片实例详解
  8. android 自定义toast停留时间
  9. android之自定义ViewGroup和自动换行的布局的实现

随机推荐

  1. Android的两种拍照方法
  2. android Thumbnail攻略
  3. Android OpenGL 编写简单滤镜
  4. Android之TextView属性列表
  5. Android Span的各种使用方法,简单、易懂、
  6. android适配不同分辨率的手机
  7. Android 之父的手机公司,关了
  8. Android 为 Android 开发访问 JAX-RS Web
  9. android电话流程(打电话,接电话,挂断电话)
  10. android 图形底层实现