您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > Android电源管理框架
Android电源管理框架1.Android系统电源管理框架简介2.Android系统电源状态之间转换过程3.Android核心服务之PoweManagerServiceAndroid电源框架的简介电源管理(PowerManagement)在任何设备中都是最重要的组成部分之一,良好的电源管理方案可以达到节能、延长电池寿命、降低辐射、降温、延长设备使用寿命等目的。电源管理是实现低功耗的一种方式,处理器通常都会多种低功耗的状态,当系统空闲的时候可以根据需要让处理器进入低功耗状态,低功耗是个系统问题,单凭处理器不足以实现整个系统的低功耗,因此需要与外设配合来实现,在硬件提供的低功耗机制基础上,需要软件系统(操作系统,驱动程序,上层应用)一起来发挥硬件低功耗的潜能,最终实现整个系统的低功耗1.1Android电源管理概述Android电源框架的简介1.2电源管理框架的结构组织Android的电源管理主要是通过锁和定时器来切换系统的状态,使系统的功耗降至最低,整个系统的电源管理架结构分为四大部分:应用层,框架层,HAL层和Kernel层。Android电源框架的简介Android电源框架的简介HAL层:该层只有一个Power.c文件,该文件通过sysfs的方式与kernel进行通信。主要功能有申请wake_lock,释放wake_lock,设置屏幕状态等。用户空间的native库绝不能直接调用Android电源管理(见上图)。绕过Android运行时的电源管理政策,将破坏该系统。所有对电源管理的调用应通过Android的PowerManagerAPI来完成。Android电源框架的简介Kernel层:内核层的电源管理方案实现主要包含三部分:1、Kernel\power\:实现了系统电源管理框架机制2、Arch\arm(ormipsorpowerpc)\mach-XXX\pm.c:实现对特定板的处理器电源管理3、drivers\power:是设备电源管理的基础框架,为驱动提供了电源管理接口。android提供了几种低功耗状态:earlysuspend、suspend、hibernation。其中,earlysuspend可以让某些设备选择进入某种功耗较低的状态,如LCD灭掉;suspend是指除电源模块以外的外围模块和CPU均不工作,只有内存保持自刷新的一个工作状态;hibernation是指所有内存镜像都被写入到磁盘中,然后系统关机,重启后系统将恢复到关机之前的状态。。Android系统电源状态之间转换过程系统电源的三种状态:AWAKE、SLEEP、NOTFIACTION核心服务之PoweManagerServicePMS总体架构PMS的初始化init函数和systemReady函数PMS的唤醒锁WakeLockPower类以及LightService类介绍PMS的用户触发事件userAcitiviy函数Power按键处理分析核心服务之PoweManagerService核心服务之PoweManagerService2.1电源管理的总体架构图如下核心服务之PoweManagerService主要是为了支持省电也降低功耗,目前支持的功能:1、设置屏幕的打开与关闭2、屏幕背景灯的打开与关闭3、键盘灯的打开与关闭4、按键灯的打开与关闭5、调整屏幕的亮度2.2PowerManagerService继承结构核心服务之PoweManagerService核心服务之PoweManagerService2.3PMS的初始化init函数核心服务之PoweManagerServicePMS第三阶段的工作,此时系统中大部分服务已经创建好,即将进入就绪阶段工作,在systemReady中完成,主要工作为:第一:PowerManagerService创建SensorManager,通过它可以与对应的传感器交互,PMS仅仅是启用或者禁止特定的传感器,而来自传感器的数据将通过回调的方式通知PMS,PMS根据接收到的传感事件做相应处理第二:通过setPowerState()函数设置电源状态为All_LIGHT,此时屏幕和键盘的灯全部都会亮第三:调用BatteryStatsService提供的函数,以通知屏幕打开事件,在BatteryStatsService中处理该事件。2.4PMS的systemReady函数核心服务之PoweManagerService当系统中的服务都在systemReady()中处理完之后,系统会广播一次ACTION_BOOT_COMPLETED消息,而PMS也将处理该广播privatefinalclassBootCompletedReceiverextendsBroadcastReceiver{@OverridepublicvoidonReceive(Contextcontext,Intentintent){bootCompleted();}}2.5PMS的BootCompletedReceiver广播接收器核心服务之PoweManagerServicevoidbootCompleted(){Slog.d(TAG,bootCompleted);synchronized(mLocks){mBootCompleted=true;//调用此函数,手机将被唤醒,此时将重新计算屏幕超时的时间userActivity(SystemClock.uptimeMillis(),false,BUTTON_EVENT,true);updateWakeLockLocked();mLocks.notifyAll();}}核心服务之PoweManagerServiceWakeLock是android系统提供给应用程序获取电力资源的唯一方法,只要还有地方使用WakeLock,系统就不会进入休眠状态。WakeLock的用法:PowerManagerpm=(PowerManager)getSystemService(Context.POWER_SERVICE);//创建一个WakeLockWakeLockwakeLock=pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK,MyTag);wakeLock.acquire();//获取该锁….......完成其他工作wakeLock.release();//释放该锁这三个函数由PMS的Binder客户端的PowerManager使用2.5PMS的WakeLock2.5.1WakeLock客户端WakeLock构造函数的第一个参数flags很关键,它用于控制CPU/Screen/Keyboard的休眠状态,flags的可选值核心服务之PoweManagerService由上图表分析可知:第一:WakeLock只控制CPU、Screen、Keyboard第二:表中最后两项是附加标志,和前面其他WakeLock组合使用,注意:PARTIAL_WAKE_LOCK比较特殊,附加标志不能影响它第三:PARTIAL_WAKE_LOCK不受电源键控制,按power键不进入系统休眠(屏幕可以关闭,单cpu不休眠)。客户端创建了WakeLock,需要调用acquire()函数,而该函数又调用了PMS的acquireWakeLock函数与PMS交互以保证电力的供应正常。核心服务之PoweManagerService客户端创建了WakeLock,PM需要调用acquire()函数,而该函数又调用了服务端PMS的acquireWakeLock函数与PMS交互以保证电力的供应正常。核心服务之PoweManagerServicePMS的acquireWakeLock函数总结:第一:如果对应的WakeLock不存在,则创建一个WakeLock对象,同时将WakeLock的标志转换为minState,否则从mLocks中查找对应的WakeLock对象,然后更新其中的信息第二:当WakeLock标志和屏幕有关,需要做相应的处理,例如点亮屏幕,打开按键灯等,实际上这些工作不仅影响电源管理,还影响用户体验,其中穿插了一些和用户体验相关的逻辑(如mPreventScreenOn变量)第三:当WakeLock和PARTIAL_WAKE_LOCK有关时,仅简单调用Power.java类的acquireWakeLock函数即可,其中涉及和LinuxKernel电源管理系统交互核心服务之PoweManagerServicePMS的acquireWakeLock函数总结:第一:如果对应的WakeLock不存在,则创建一个WakeLock对象,同时将WakeLock的标志转换为minState,否则从mLocks中查找对应的WakeLock对象,然后更新其中的信息第二:当WakeLock标志和屏幕有关,需要做相应的处理,例如点亮屏幕,打开按键灯等,实际上这些工作不仅影响电源管理,还影响用户体验,其中穿插了一些和用户体验相关的逻辑(如mPreventScreenOn变量)第三:当WakeLock和PARTIAL_WAKE_LOCK有关时,仅简单调用Power.java类的acquireWakeLock函数即可,其中涉及和LinuxKernel电源管理系统交互核心服务之PoweManagerServicePowerManagerService有时需要进行点亮屏幕,打开键盘灯等操作,为此Android提供了Power类以及LightService满足PowerManagerService的要求,这两个类比较简单,但是背后的kernel层相对复杂:3、Power类以及LightService类的介绍核心服务之PoweManagerService核心服务之PoweManagerService(1)Power类分析Power主要是提供给kernel层交互的通道,它提供了六个函数,通过JNI接口调用底层,JNI层有对应的代码实现(在android_os_Power.cpp文件中)://获取kernel层的WakeLockpublicstaticnativevoidacquireWakeLock(intlock,Stringid);//释放kernel层的WakeLockpublicstaticnativevoidreleaseWakeLock(Stringid);//打开或关闭屏幕publicstaticnativeintsetScreenState(booleanon);//设置超时时间publicstaticnativeintsetLastUserActivityTimeout(longms);//手机关机,已过期publicstaticnativevoidshutdown();//手机重启publicstaticvoidreboot(Stringreason)throwsIOException{rebootNative(reason);}privatestaticnativevoidrebootNative(Stringreason)throwsIOException;LightsService.Light设置了八种类型的灯,主要有两个native函数staticfinalintLIGHT_ID_BACKLIGHT=0;staticfinalintLIGHT_ID_KEYBOARD=1;staticfinalintLIGHT_ID_BUTTONS=2;staticfinalintLIGHT_ID_BATTERY=3;staticfinalintLIGHT_ID_NOTIFICATIONS=4;staticfinalintLIGHT_ID_ATTENTION=5;staticfinalintLIGHT_ID_BLUETOOTH=6;staticfinalintLIGHT_ID_WIFI=7;(2)LightService类核心服务之PoweManagerServiceprivatestat
本文标题:Android电源管理框架
链接地址:https://www.777doc.com/doc-5428402 .html