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狀態的鎖.
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(); //釋放鎖,顯示的釋放,如果申請的鎖不在此釋放系統就不會進入休眠。
/frameworks/base/core/java/android/os/Power.java
注: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層交互的地方。