Android电源管理方面网上资料比较多,这里就梳理下Android源码的线索,关注wake_lock和early_suspend。
使一个应用程序不进入睡眠,须在上层申请一个wakelock锁,并对该锁进行持有。在acquire()和release()间,进程保持running状态。持有锁acquire()经过framework层PowerManagerService.java到抽象层Power.cpp,实质就是在/sys/power/wake_lock里写入锁的名字,释放锁release()实质就是在/sys/power/wake_unlock里写入锁的名字。经Linux文件系统,内核对其上锁或解锁,即wake_lock()或wake_unlock(),即不准suspend或进入suspend。
搞清楚has_wake_lock_locked(),返回值>0说明有超时锁,需要在超时以后进入suspend;返回值=0说明没有锁,直接进入suspend;返回值<0说明持有永久锁,这也是最常见的一种用法,系统无法进入suspend。
使系统唤醒或休眠,上层分别使用userActivity和goToSleep,实质就是往/sys/power/state里写入on或mem,底层通过文件系统最终调用request_suspend_state()