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