Android锁Wake Lock

转载 2012年03月27日 10:46:36

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层交互的地方。

PowerManagerService电源管理和Wacklock锁申请与释放机制

一. 电源管理概述     电源管理(PowerManager)在任何设备中都是最重要的组成部分之一,良好的电源管理方案可以达到节能、延长电池寿命、降低辐射、降温等目的。 移动设备...
  • qq_25804863
  • qq_25804863
  • 2015年09月24日 01:07
  • 7413

android 休眠唤醒机制分析(一) — wake_lock

Android的休眠唤醒主要基于wake_lock机制,只要系统中存在任一有效的wake_lock,系统就不能进入深度休眠,但可以进行设备的浅度休眠操作。wake_lock一般在关闭lcd、tp但系统...
  • dragon101788
  • dragon101788
  • 2014年12月17日 18:11
  • 1249

Android提高篇之-WakeLock应用与问题排查

本系列不讲如何使用wakelock,具体用法可以Google之。 wakelock申请忘记释放会造成手机耗电太快,严重影响用户体验,用户知道骂娘,厂商知道骂开发煞笔。废话说多了,进入正题。 我们现在...
  • HMC20071120015
  • HMC20071120015
  • 2014年03月03日 23:19
  • 3272

Android wakelock 学习总结第三篇

转载自:http://slightsnow.blog.chinaunix.net/uid-29269256-id-4093367.html
  • suck666
  • suck666
  • 2014年08月22日 10:56
  • 4449

Android wakelock 学习总结第一篇

转载自: http://slightsnow.blog.chinaunix.net/uid-29269256-id-4090529.html
  • suck666
  • suck666
  • 2014年08月22日 10:51
  • 2364

Android中三种锁的用法

一、synchronized 略   二、lock Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获...
  • boyupeng
  • boyupeng
  • 2015年09月02日 17:58
  • 6276

Android多线程研究(9)——线程锁Lock

在前面我们在解决线程同步问题的时候使用了synchronized关键字,今天我们来看看Java 5.0以后提供的线程锁Lock.Lock接口的实现类提供了比使用synchronized关键字更加灵活和...
  • lxq_xsyu
  • lxq_xsyu
  • 2014年06月08日 21:08
  • 7574

代码浅析 Android Lock 、ReentrantLock线程锁及其作用

先来了解什么是“互斥锁”? 百度一下,解释如下:在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线...
  • zy_style
  • zy_style
  • 2016年12月01日 17:17
  • 800

类锁 synchronized对象锁 和 Lock对象锁

在并发环境下,解决共享资源冲突问题时,可以考虑使用锁机制。1. 对象锁所有对象都自动含有单一的锁。JVM负责跟踪对象被加锁的次数。如果一个对象被解锁,其计数变为0。在任务(线程)第一次给对象加锁的时候...
  • qq_33530388
  • qq_33530388
  • 2017年03月18日 18:45
  • 1104

Android休眠唤醒和wakeup_source机制的使用(1)

基本概念及流程说明 Android自从到4.4之后就摈弃了臃肿的wake lock 机制,使用linux3.4之后加上的 wakeup_souce机制。到底wakeup_source 机制是怎样工作...
  • hbk320
  • hbk320
  • 2015年08月09日 18:22
  • 5400
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android锁Wake Lock
举报原因:
原因补充:

(最多只允许输入30个字)