android system wake

来源:互联网 发布:启动mysql错误1067 编辑:程序博客网 时间:2024/05/01 20:01
       本文主体属于转载,额外添加了自己的一些修改,方便学习之用。 
       Wake Lock是一种锁的机制, 只要有人拿着这个锁,系统就无法进入休眠,可以被用户态程序和内核获得。
 
        这个锁可以是有超时的或者是没有超时的,超时的锁会在时间过去以后自动解锁. 如果没有锁了或者超时了, 内核就会启动休眠的那套机制来进入休眠。
 
        (一).内核维护了如下相关链表:
            1).两个链表,active_wake_locks[WAKE_LOCK_TYPE_COUNT]
          active_wake_locks[0]维护的是suspend lock.
          active_wake_locks[1]维护的是idle lock.
 
         WAKE_LOCK_TYPE_COUNT定义于kernel/include/linux/wakelock.h中:
enum {
        WAKE_LOCK_SUSPEND, /* Prevent suspend */
        WAKE_LOCK_TYPE_COUNT
};
         在kernel/kernel/power/wakelock.c中:
      for (i = 0; i < ARRAY_SIZE(active_wake_locks); i++)
                INIT_LIST_HEAD(&active_wake_locks[i]);
 
   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 claz, 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层交互的地方。

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 住房公积金网站 广州住房公积金查询 河南省住房公积金查询 福州住房公积金管理中心 常州住房公积金查询 遂宁市住房公积金管理中心 天津市住房公积金管理中心 湖南住房公积金查询个人账户 深圳住房公积金电话 住房公积金查询网 洛阳住房公积金 呼和浩特住房公积金查询 青海省住房公积金查询 郑州住房公积金管理中心 苏州住房公积金查询 成都住房公积金查询个人账户 住房公积金中心电话 昆山住房公积金管理中心 吉林市住房公积金查询 沈阳住房公积金 沈阳住房公积金管理中心 贵港市住房公积金管理中心 萍乡住房公积金查询 郑州市住房公积金 赣州市住房公积金管理中心 济南住房公积金查询 济宁市住房公积金个人查询 西安住房公积金查询网 西安市住房公积金中心 西安市住房公积金 西安市住房公积金管理中心 西安市个人住房公积金查询 个人住房公积金查询个人账户 西安住房公积金个人帐户查询 住房公积金账户 查询住房公积金个人账户余额 怎么查询住房公积金 个人住房公积金 怎样查询住房公积金账户余额 西安个人住房公积金查询 住房公积金怎么用