android PowerManager 详细分析(一)
来源:互联网 发布:中英联合声明失效 知乎 编辑:程序博客网 时间:2024/06/06 05:44
Android的电源管理主要是通过wakelock机制来管理系统的状态,整个android电源管理,可以分为四个层次:应用接口层(PowerManager.java),Framework层(PowerManagerService.java),HAL层(Power.c),和内核层(kernel/Power)。
应用接口层:PowerManager中开放给应用一系列接口,应用可以调用PM的接口申请wakelock,唤醒系统,使系统进入睡眠等操作;
Framework层:应用调用PowerManager开放的接口,来对系统进行一些列的操作是在PowerManagerService中完成的,PowerManagerService计算系统中和Power相关的计算,是整个电源管理的决策系统。同时协调Power如何与系统其它模块的交互,比如亮屏,暗屏,系统睡眠,唤醒等等。
HAL层:该层只有一个power.c文件,该文件通过上层传下来的参数,向/sys/power/wake_lock或者/sys/power/wake_unlock文件节点写数据来与kernel进行通信,主要功能是申请/释放锁,维持屏幕亮灭
Kernel层:内核层实现电源管理的方案主要包含三个部分:
1、Kernel/power/:实现了系统电源管理框架机制。
2、Arch/arm(ormips or powerpc)/mach-XXX/pm.c:实现对特定板的处理器电源管理。
3、drivers/power:是设备电源管理的基础框架,为驱动提供了电源管理接口。
Android电源管理框架如下图:
电源管理服务——PowerManagerService
PowerManagerServcie是android系统电源管理的核心服务,它在Framework层建立起一个策略控制方案,向下决策HAL层以及kernel层来控制设备待机状态,控制显示屏,背光灯,距离传感器,光线传感器等硬件设备的状态。向上提供给应用程序相应的操作接口,比如听音乐时持续保持系统唤醒,应用通知来临唤醒手机屏幕等场景
启动过程
SystemServer在系统启动的时候会启动三类服务:引导关键服务,核心服务,其他服务;PowerManagerService是在SystemServer中创建的,并将其作为一个系统服务加入到ServiceManager中:
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
在启动引导关键服务调用startBootstrapServices(),其中各种服务都是通过SystemServiceManager中的startService()函数来启动:
public T startService(Class serviceClass) {
final String name = serviceClass.getName();
final T service;
Constructor constructor = serviceClass.getConstructor(Context.class);
service = constructor.newInstance(mContext);
mServices.add(service);//注册服务到服务列表中去
service.onStart();//启动服务
}
在启动PowerManagerService时,传入的参数类是PowerManagerService,在startService()中首先调用PowerManagerService的构造函数,然后调用其onStart()函数
PowerManagerServcie的构造函数:
mHandler = new PowerManagerHandler(mHandlerThread.getLooper());
synchronized (mLock) {
mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService.WakeLocks");
mDisplaySuspendBlocker = createSuspendBlockerLocked("PowerManagerService.Display");
mDisplaySuspendBlocker.acquire();
mWakefulness = WAKEFULNESS_AWAKE;
nativeInit();
创建一个处理消息和发送消息的线程mHandler,并且两种标志flag的wakelock锁:PowerManagerService.WakeLocks和PowerManagerService.Display,前者是传入到底层是控制cpu唤醒状态,后者则是控制屏幕亮灭。在构造函数最后调用nativeInit();在native层初始化相关资源。将mWakefulness 置成WAKEFULNESS_AWAKE状态,mWakefulness 标识系统当前状态共有四种定义:
WAKEFULNESS_ASLEEP:表示系统当前处于休眠状态,只能被wakeUp()调用唤醒。
WAKEFULNESS_AWAKE:表示系统目前处于正常运行状态。
WAKEFULNESS_DREAMING:表示系统当前正处于屏保的状态。
WAKEFULNESS_DOZING:表示系统正处于“doze”状态。这种状态下只有低耗电的“屏保”可以运行,其他应用进程都被挂起。
- android PowerManager 详细分析(一)
- android PowerManager分析(非常详细)
- (原创)android PowerManager分析(十分详细)
- android系统 PowerManager深入分析(非常详细)
- android PowerManager分析
- Android PowerManager分析
- android6.0系统 PowerManager深入分析(非常详细)
- Android 锁屏(PowerManager)
- (原创)android6.0系统 PowerManager深入分析(非常详细)
- android6.0系统 PowerManager深入分析(非常详细) << 推荐阅读
- Android Netd详细分析(一)概述
- PowerManager分析
- Android PowerManagerService和PowerManager 源码分析
- android powermanager
- android PowerManager亮灭屏(实现篇)
- Android开发之GSM驱动模块详细分析(一)
- android待机详细结合代码分析(一)
- Android PackageManagerService流程详细分析(一)之启动
- [LeetCode] 199. Binary Tree Right Side View
- Linux系统的优点小结
- Linux: grep多个关键字“与”和“或”
- 在myeclipse10.7中设置两个tomcat
- 利用java注解,做一些简单的逻辑处理
- android PowerManager 详细分析(一)
- 欢迎使用CSDN-markdown编辑器
- linux上ln命令详细说明
- android 获取Bitmap位图所占用的内存大小
- datatables(1.10.10+)+模块化请求(require.js or others)
- 谈谈final
- UITableview性能优化总结
- Android IBinder的linkToDeath介绍及情景模拟
- Android-Activity