Android4.0 在PowerManagerService中,当执行setScreenStateLocked时会通过jni调用
hardware/libhardware_legacy/power/power.c中的set_screen_state,
进行关屏与开屏的操作。
关屏时,向/sys/power/state写入"mem"
开屏时,向/sys/power/state写入"on"
而kernel在接到"mem"时,不但会关屏,还会进入early suspend状态。
early suspend是允许有锁存在的。
如果没有锁存在,又进入early suspend状态,就可能会进入kernel的睡眠状态,suspend。
如果上层既不想抓屏幕的锁,想要灭屏,又不想灭屏后进入kernel的suspend的状态,
可以抓一个PowerManager.PARTIAL_WAKE_LOCK的锁,这样,就等于直接抓了
kernel中的wake_lock锁,也即向/sys/power/wake_lock中写入模块的名字,表示这个模块抓了wack_lock
的锁,可以用cat /sys/power/wake_lock看到kernel锁的状态。
hal层的许多service就是直接抓kernel的wake_lock锁的,只不过它们不是通过PowerManagerService抓的,而是直接在下层包
含libhardware_legacy这个库操作的。
具体可以看下图:
