转自:http://blog.csdn.net/pillarbuaa/article/details/9117299

凭借记忆只重写如下总结:

1. Early suspend/ late resume 是android 添加的机制,用户关闭LCD, TS, Sensors等为了省电。可称之为浅度休眠

2.Linux的Suspend/resume 仍然有效,可称之为深度休眠

3.echo mem > sys/power/state 会触发early suspend,

echoon > sys/power/state 会触发late resume,

cat sys/power/state 会显示当前支持的休眠状态,有mem, on, standby选项,但针对android 则只有mem, 同时无条件支持on

4. LCD, TS, Sensors等设备会注册early suspend 和late resume 回调函数,用于early suspend/late resume时逐个执行。

5. User space 通过操作 sys/power/wake_lock, sys/power/wake_unlock 可以向kernel申请一个wake lock;

cat sys/power/wake_lock 或wake_unlock 只是显示User Space 申请的wake lock, kernel 申请的wake lock显示不出来

6. cat proc/wakelocks 可以显示所有的wake lock的信息

7. Early suspend/Late resume中有一个关键wake lock是main_wake_lock, 执行early suspend后会unlock main_wake_lock;执行late resume之前会lock main_wake_lock.

8. 当任何一个wake lock被unlock时,会检测是否有其他wake lock处于locked状态?如果没有则系统进入 linux 常规suspend

9. 一般而言android系统是否休眠,是由user space发起的,而kernel space 是不能主动进入休眠的;当android系统需要进入休眠时,user space 执行echo mem > sys/power/state;强迫kernel进入early suspend状态,如果还没有任何wake lock被locked,则进入linux 常规suspend.

10. 如果android系统没有进入深度休眠,则user space发起echo on> sys/power/state, 则系统马上执行late resume, 唤醒LCD,TS,sensor等;如果已经进入深度休眠,则另外处理

11. kernel会依次同步文件系统,执行各设备注册的suspend, 执行system core的suspend disble bus和irq等,然后进入深度休眠后会在suspend_enter@kernel/kernel/power/suspend.c中的 suspend_ops->enter(state) 系统挂起,直到有硬件的操作唤醒;一旦被唤醒则依次执行system core resume, device resume等,最后还会执行late resume.

12. User space 向kernel申请wake lock时, 写入sys/power/wake_lock 的buf格式为<wakelock名称> [延时的纳秒数];但是User space 没有这么使用,android在java层自己实现了 计数wake lock和记次wake lock.

13. Early suspend/late resume 针对LCD,TS等设备来说,所起的作用与suspend/resume是一样的。一般而言 两者不会同时使用 , Early suspend/late resume只是在Linux kernel 系统不能深度休眠时,还能执行从而关掉某些设备,达到省电的目的。

主要源代码路径

[Kernel]
1. @kernel/drivers/base/power/main.c
2. @kernel/kernel/power/suspend.c
3. @kernel/kernel/power/main.c
4. @kernel/kernel/power/earlysuspend.c
5. @kernel/kernel/power/wakelock.c
6. @kernel/drivers/base/syscore.c
7. @kernel/kernel/power/userwakelock.c
[User space]
1. @frameworks/base/services/java/com/android/server/powermanagerservice.java
2. @frameworks/base/services/jni/com_android_server_powermanagerservice.cpp
3. @system/core/libsuspend/autosuspend.c
4. @system/core/libsuspend/autosuspend_earlysuspend.c
5. @frameworks/base/services/java/com/android/server/systemserver.java
6. @hardware/libhardware_legacy/power/power.c
7. @frameworks/base/core/java/android/os/powermanager.java

更多相关文章

  1. 【Android(安卓)Native Code开发系列】二 Ubuntu系统安装及软硬
  2. Android事件分发机制——View(一)
  3. Android(安卓)2.2 API Demos -- Intents Chooser
  4. Android下新增JNI过程中启动新增系统服务(addService)遇安全错误问
  5. android模拟器不能上网解决
  6. 【Android(安卓)Developers Training】 18. 重新创建一个Activit
  7. android 创建系统级的Dialog时,无法使用Home关闭的问题
  8. android webview用法小结1
  9. Android图形系统(十三)-Vsync信号处理

随机推荐

  1. Android横竖屏总结
  2. arm-linux-androideabi-gcc 4.8的选项分
  3. Android(安卓)Intent
  4. android设置状态栏颜色
  5. Android:Manifest merger failed with mu
  6. 简单的Android日志文件记录类
  7. 淡入淡出动画
  8. [Android] 环境配置之Android(安卓)Studi
  9. Android(安卓)中播放内存中视频
  10. Android(安卓)JNI入门实例