android 和linux的休眠唤醒机制.doc

  1. 1、本文档共73页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
android 和linux的休眠唤醒机制 四、android层源码解析hardware/libhardware_legacy/power/power.c //HAI层 2. frameworks/base/core/jni/android_os_Power.cpp //jni层frameworks/base/core/java/android/os/Power.java //java层 在linux之上经过android的软件堆层层封装,最终在上层的java应用程序中使用。休眠唤醒也是从最上层发出的命令,然后一层一层地将参数解析,往最底层传,最后走上标准linux的休眠唤醒之路。 这一部分将会初略分析休眠唤醒机制上linux之上所走的路线。 在linux之上,存在一个hal层,专门做和linux内核设备打交道的事情,这里也不例外。休眠唤醒机制的hal层源码位于:@hardware/libhardware_legacy/power/power.c 该文件源码比较简单,下面列举重点片段: enum { ACQUIRE_PARTIAL_WAKE_LOCK = 0, RELEASE_WAKE_LOCK, REQUEST_STATE, OUR_FD_COUNT }; const char * const NEW_PATHS[] = { /sys/power/wake_lock, /sys/power/wake_unlock, /sys/power/state }; static int g_initialized = 0; static int g_fds[OUR_FD_COUNT]; static const char *off_state = mem; static const char *on_state = on; static int open_file_descriptors(const char * const paths[]) { int i; for (i=0; iOUR_FD_COUNT; i++) { int fd = open(paths[i], O_RDWR); if (fd 0) { fprintf(stderr, fatal error opening \%s\\n, paths[i]); g_error = errno; return -1; } g_fds[i] = fd; } g_error = 0; return 0; } static inline void initialize_fds(void) { if (g_initialized == 0) { if(open_file_descriptors(NEW_PATHS) 0) { open_file_descriptors(OLD_PATHS); on_state = wake; off_state = standby; } g_initialized = 1; } } int acquire_wake_lock(int lock, const char* id) { initialize_fds(); if (g_error) return g_error; int fd; if (lock == PARTIAL_WAKE_LOCK) { // 上层传下来的lock type fd = g_fds[ACQUIRE_PARTIAL_WAKE_LOCK]; } else { return EINVAL; } return write(fd, id, strlen(id)); } int release_wake_lock(const char* id) { initialize_fds(); // LOGI(release_wake_lock id=%s\n, id); if (g_error) return g_error; ssize_t len = write(g_fds[RELEASE_WAKE_LOCK], id, strlen(id)); return len = 0; } int set_screen_state(int on) { QEMU_FALLBACK(set_screen_state(on)); LOGI(*** set_screen_state %d, on); initialize_fds(); if (g_error) return g_error; char buf[32]; int len; if(on) len = sprintf(buf, on_state); else len = sprintf(buf, off_state); len = write(g_fds[REQUE

文档评论(0)

hong333666 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档