Wake Lock是一种锁的机制, 只要有人拿着这个锁,系统就无法进入休眠,
可以被用户态程序和内核获得. 这个锁可以是有超时的或者是没有超时的,
超时的锁会在时间过去以后自动解锁. 如果没有锁了或者超时了, 内核就
会启动休眠的那套机制来进入休眠.
(一).内核维护了:
1).两个链表,active_wake_locks[WAKE_LOCK_TYPE_COUNT]
   active_wake_locks[0]维护的是suspend lock.
   active_wake_locks[1]维护的是idle lock.
2).一个链表,inactive_locks来记录所有处于inactive状态的锁.

 (二). 下面讲述应用层申请的锁怎么传到kernel下面的,来理解
       整个wakelock的框架。
       比如/sys/power/wake_lock 下面的PowerManagerService
       的生成过程。
    
     1). Android 提供了现成 android.os.PowerManager 类 ,类中
      提供 newWakeLock(int flags, String tag)方法来取得相应
      层次的锁, 此函数的定义
         frameworks/base/core/java/android/os/PowerManager.java
      下面,应用程序在申请wake_lock时都会有调用。
       实例:
        PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock
                                                   (PowerManager.SCREEN_DIM_WAKE_LOCK, “My Tag”);
        wl.acquire();//申请锁这个里面会调用PowerManagerService里面acquireWakeLock()
 
 ***********************
        wl.release(); //释放锁,显示的释放,如果申请的锁不在此释放系统就不会进入休眠。
 

2). frameworks层
/frameworks/base/services/java/com/android/server/
 PowerManagerService.java
这个类是来管理所有的应用程序申请的wakelock。比如音视
频播放器,camera等申请的wakelock都是通过这个类来管理的。
static final String PARTIAL_NAME = "PowerManagerService"
Power.acquireWakeLock(Power.PARTIAL_WAKE_LOCK,
                                                                   PARTIAL_NAME);
这个函数调用Power类里面的acquireWakeLock(),此时的
PARTIAL_NAME作为参数传递到底层去。
/frameworks/base/core/java/android/os/Power.java
public static native void acquireWakeLock(int lock, String id);
注:native申明的方法在Power类中没有实现,其实现体在
       frameworks/base/core/jni/android_os_Power.cpp中,所
       以调用Power类的acquireWakeLock()方法时会调用JNI
       下的实现方法。
   3).JNI层的实现
     路径:frameworks/base/core/jni/android_os_Power.cpp
    static void acquireWakeLock(JNIEnv *env, jobject clazz,
                                                          jint lock, jstring idObj)
  {
    **************
      const char *id = env->GetStringUTFChars(idObj, NULL);
      acquire_wake_lock(lock, id);
      env->ReleaseStringUTFChars(idObj, id);
  }
     注:在acquireWakeLock()中调用了
             路径下hardware/libhardware_legacy/power/power.c下面
 的acquire_wake_lock(lock, id)
4).与kernel层的交互
在power.c下的acquire_wake_lock(lock, id)函数如下:
 int acquire_wake_lock(int lock, const char* id)
 {  
 **************
     return write(fd, id, strlen(id));
 }
注: fd就是文件描述符,在此表示”/sys/power/wake_lock”
         id就是从PowerManagerService类中传下来的参数即:
         PARTIAL_NAME = "PowerManagerService"
         到此就是通过文件系统来与kernel层交互的地方。

android的wake_lock介绍的更多相关文章

  1. Android sdk目录介绍

    android sdk目录介绍 build-tools 各版本SDK编译工具 docs 离线开发者文档Android SDK API参考文档 extras 扩展开发包,如兼容架包. platforms ...

  2. Android异常:唤醒锁未授权。(Caused by: java.lang.SecurityException: Neither user 10044 nor current process has android.permission.WAKE_LOCK.)

    Android异常:Caused by: java.lang.SecurityException: Neither user 10044 nor current process has android ...

  3. 我的Android第三章:Android的组件介绍

    小编摘录了Android文档介绍Android四大组件的基本内容,感觉文档的内容写的很详细所以小编将它写入了博客 Android 使用Java语言开发.Android SDK 工具编译代码-以及任意数 ...

  4. GitHub上排名前100的Android开源库介绍(来自github)

    本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍,至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果,然后过滤了 ...

  5. android MVP模式介绍与实战

    android MVP模式介绍与实战 描述 MVP模式是什么?MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数 ...

  6. Android 不同文件名介绍

    Android 不同文件名介绍

  7. Android发展简单介绍

    Android一词的本义指“机器人”,同一时候也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统.中间件.用户界面和应用软件组成,号称是首个为移动 ...

  8. Android IntentService使用介绍以及源码解析

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.IntentService概述及使用举例 IntentService内部实现机制用到了HandlerThread,如果对HandlerThrea ...

  9. android 屏幕保持唤醒 不锁屏 android.permission.WAKE_LOCK

     In AndroidManifest.xml 加上权限: <uses-permission android:name="android.permission.WAKE_LOCK& ...

随机推荐

  1. bzoj2383[CEOI2011] ballons

    题意 在一条数轴上从左向右有一些气球,每个气球一开始位于横坐标xi的位置,是半径为0的圆.现在开始从左向右给每个气球充气.被充气的气球的半径会不断变大,直到达到这个气球的半径上限Ri或者这个气球和之前 ...

  2. 题解 P1781 【宇宙总统】

    小金羊发现用的方法和python大佬们的方法还是不一样... (大概是我太弱了qAq) emmm... (Mode:Python 3)Code: a=int(input()) #几个数 L=list( ...

  3. P3984 高兴的津津

    题目描述 津津上高中了.她在自己的妈妈的魔鬼训练下,成为了一个神犇,每次参加一次OI比赛必拿Au虐全场.每次她拿到一个Au后就很高兴.假设津津不会因为其它事高兴,并且她的高兴会持续T天(包包含获奖当天 ...

  4. 51nod 1317 相似字符串对(容斥原理+思维)

    题意: 称一对字符串(A,B)是相似的,当且仅当满足以下条件: (1)字符串A和B都恰好包含N个字符: (2)A和B串中的每个字符都是小写字母的前k个字符,即A.B中只可能出现'a','b','c', ...

  5. Linux内核分析第二周学习博客——完成一个简单的时间片轮转多道程序内核代码

    Linux内核分析第二周学习博客 本周,通过实现一个简单的操作系统内核,我大致了解了操作系统运行的过程. 实验主要步骤如下: 代码分析: void my_process(void) { int i = ...

  6. mysql互为主从复制配置笔记--未读,稍后学习

    MySQL-master1:192.168.72.128 MySQL-master2:192.168.72.129 OS版本:CentOS 5.4MySQL版本:5.5.9(主从复制的master和s ...

  7. tableau学习

    一.维度 度量 1. 连接到新数据源时,Tableau 会将该数据源中的每个字段分配给“数据”窗格的“维度”区域或“度量”区域,具体情况视字段包含的数据类型而定. 例如: 2. tableau中的字段 ...

  8. python学习(九) 网络编程学习--简易网站服务器

    python `网络编程`和其他语言都是一样的,服务器这块步骤为:`1. 创建套接字``2. 绑定地址``3. 监听该描述符的所有请求``4. 有新的请求到了调用accept处理请求` Python ...

  9. stout代码分析之零

    最近在使用mesos做高可用设计,在编译的过程中注意到mesos依赖stout,一个仅仅含有头文件的c++基础库.stout代码简洁,设计优雅,值得一读. stout从内容上可细分为以下几块: Pri ...

  10. Redis安装部署【转】

    Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支持在服务器端计算集合的并,交和补集(diff ...