首先在external目录下创建一个目录shutdown,然后进入shutdown目录,创建两个文件Android.mk和shutdown.c,增加内容如下:
#define LOG_TAG "shutdown"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/reboot.h>
#include <utils/Log.h>
int main(int argc, char *argv[])
{
int ret;
ALOGI("Shutdown now...\n");
ret = __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,
RB_POWER_OFF, NULL);
if (ret < 0) {
ALOGE("Shutdown failed!\n");
exit(-1);
}
return 0;
}
Android.mk
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := shutdown.c
LOCAL_SHARED_LIBRARIES := liblog
LOCAL_MODULE := shutdown
include $(BUILD_EXECUTABLE)
mm方式编译一下,然后push到/system/bin目录下,执行shutdown命令就可以实现关机操作了。
shutdown.c修改如下:
#define LOG_TAG "shutdown"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/reboot.h>
#include <utils/Log.h>
int main(int argc, char *argv[])
{
int ret;
ALOGI("Shutdown now...\n");
/*ret = __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,
RB_POWER_OFF, NULL);*/
ret = reboot(RB_POWER_OFF);
if (ret < 0) {
ALOGE("Shutdown failed!\n");
exit(-1);
}
return 0;
}
这里采用reboot这个系统调用,这个系统调用是glibc提供的,原型如下:
#include <unistd.h>
#include <sys/reboot.h>
int reboot(int cmd);
通过man可以看到常见支持下面的命令:
LINUX_REBOOT_CMD_RESTART
LINUX_REBOOT_CMD_POWER_OFF
分别对应重启和关机,而这里为什么用了RB_POWER_OFF这个参数呢,可以在android中的bionic/libc/include/sys/reboot.h文件中看到RB_POWER_OFF就是一个宏定义,定义为LINUX_REBOOT_CMD_POWER_OFF。
什么关机命令使Linux能自动关闭电源:http://www.linuxdiyf.com/linux/4945.html