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.cppstatic 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层交互的地方。
- android system wake
- Android 使用Wake Lock
- Android 使用Wake Lock
- Android锁Wake Lock
- Android Wake lock
- Android wake lock (转)
- Android Wake Lock 机制
- Wake
- Android: softkey WAKE and WAKE_DPOPPED
- Android实现wake-on-lan
- Android中Camera的Wake Lock
- android 如何使用Wake Lock来节电?
- Android: PLEASE DO NOT USE A WAKE LOCK
- Wake Lock 经过android四层的过程
- Wake Up!!!
- wake lock/ wake unlock 应用
- How to enable USB selective suspend and system wake in the UMDF driver for a USB device
- Android system
- VC++串口通信编程详解
- 初见memcached
- java,jsp+eclipse+mysql5.6搭建环境
- 合并两个git仓库,并保留每个仓库的历史
- WEP&WPA Cracking on BT5/MAC [转]
- android system wake
- 安装HP LaserJet 1020驱动(Ubuntu)
- hdu4314
- 开源 免费 java CMS - FreeCMS1.2-标签 config
- POJ 3628 Bookshelf 2(背包)
- 选择技术还是选择销售? 肖舸
- Arcgis10 sde + desktop + web server安装、破解、配置流程for windows
- 使用Memcached、Spring AOP构建数据库前端缓存框架
- POJ2168 Joke with Turtles