Android智能手机平台电源管理技术
苏健
(重庆大学软件学院,重庆400044)
摘要:随着智能手机的普及发展,对系统的功能、可靠性、成本、体积、功耗提出了更严格的要
求,特别是电池供电系统,在电池性能严重滞后于手持终端设备需求的背景下,电源管理技术正成为这些产品设计的关键所在。在满足功能实现的前提下,使手机待机时间更长的电源管理技术已成为研究热点。通过分析目前流行的and谳d智能手机电源管理技术,探讨其现状并研究其应用前
景。关键词:Android系统;电源管理;智能手机
DOI编码:lO.3969/j.issn.1002—2279.2011.05.018中图分类号:TP36文献标识码:A文章编号:1002—2279【2011)05—0066—04
AndroidSmartPhOnePIatfOrmPOwerManagementTeChnOIOgy
SUJian(‰scJIl0Df矿黝啪reE嚼鹏e^r曙‰哪嘶所龇瑙渺,‰,嘲嘲400044,傩溉)
Abstract:witllthepopularit)rofthedevelopnlentofgmanphones,山esystem7sfunctionalit)r,
reliability。cost,size,powerconsumptionmademorestringentrequirements,inpanicuIar,battery—pw—
eredsystems’batterype怕瑚ancehasseriouslylaggedbehind.P0wermanagementtechnolog)risbecoming
t}lekeytothedesignoftheseproducts.undertllepremiseoffunction,longerstandbytimepowermanage。
menthasbecomeahotzone.卟ispaperanalysespopuIarandIDidsmanphonepowermanagement
technolo#呵andexploresthecun.entsituationandapplicationpI.ospect.
Keywords:Android;Powermanagement;Smartphone
l引言
电源管理是移动设备中最关键的技术之一,特
别是对于现代的智能手机,具有大屏幕,高频处理器,大内存,各种外设多(gps,c砌era,传感器),多任
务操作系统等特点,电源管理尤其显得重要。谷歌
的Android系统是一个平等开放的平台,其内核采
用linux,上层应用采用java,由于其稳定、开发简易
及无法比拟的资源整合,其在智能手机市场中所占
份额越来越大。linux内核层面对电源管理的支持是Andmid电源管理技术基础。
2“nux电源管理
对“nux嵌入式系统而言,电源管理可以分为静态电源管理,动态电源管理,设备电源管理等三个方面。
2.1静态电源管理Linux内核支持ON,standby,Suspend和Hiber—
Ilate四种电源状态。Standby指“带电挂起”,通过将
CPu置于halt状态,将设备置于Dl状态来达到节
能的目的(ACPI规范中按能耗从高到低分D0~
D3)。节能效果不明显,但是响应延迟最小。Sus—
pend就是挂起到RAM。在该状态下,所有设备被置
于D3状态,整个系统,除主存处于节电的自刷新模
式(self—refresh)外,全部关闭电源。响应延迟比
Standby大。Hibemate是通过将系统状态保存到非
易挥发性存储中(通常是磁盘),关闭整个系统的电
源。延迟时间最长,但比一次完整启动来得短。通
常情况下嵌入式设备都没有支持这种方式。
通过sysfs文件系统接口触发系统级电源状态
伤萱简佥:苏健(1975一),男,重庆市人,学士,主研方向:软件项目管理.嵌入式系统。
收稿日期:20lO—12—06
万方数据5期苏健:Andmid智能手机平台电源管理技术・67・
转化。转换管理是通过注册好的驱动来进行。例
如,prepare函数确认系统能够进入所请求的状态,并且进行相应的准备工作。例如通过禁止抢占和
“冷冻”所有进程来准备进入所请求的电源状态。
save函数枚举所有注册有电源管理能力的设备,保
存系统和处理器的低层状态。接着PM核心禁止中
断,关闭外部设备电源,调用Sleep函数根据挂起级
别进入睡眠状态。在嵌人式设备挂起过程中可以通
过写人某些特殊的非易失性处理器寄存器来记录挂
起的原因和挂起时的代码执行地址。系统上电后引导程序先执行,从特殊寄存器中判断系统是否从深
度睡眠(Hibemation)中恢复。如果是,则负责从非
易挥发性存储介质中恢复所有的硬件上下文。如果
不是,系统负责从sleep()函数处返回。给所有设备
上电,恢复中断。Restore函数被用来恢复系统的低
层调用,恢复设备上下文。CleaIlup函数从sleep状态恢复必须进行的清尾工作,例如抢占重新被允许,
系统恢复正常执行。当一次完整的转换完成后,CPu执行权还给之前执行的进程。
2.2动态电源管理
动态电源管理技术提供一种操作系统级别的电
源管理能力,包含工作频率和电压,外部总线时钟频
率,外部设备时钟/电源等方面的动态调节及管理功
能等。通过用户层制定策略与内核提供管理功能交
互,实时调整电源参数同时来满足系统实时应用的需求,允许电源管理参数在短时间的空闲或任务运
行在低电源需求时,可以被频繁地、低延迟地调整,
从而实现更精细、更智能的电源管理。
通过调节电压、频率来减少系统活动功耗需要
硬件支持。系统一般有多个执行单元,如电源管理
模块、片上晶振模块、锁相环模块、CPU核以及CPU
核中的数据缓存和指令缓存,其他模块统称为外围
模块(例如LCD控制器、UART、SDRAM控制器等)。
CPU高频时钟主要由PLL提供,同时PLL也为外围
模块和总线提供其他频率时钟。电源管理模块主要管理系统的电源供应状态。一般有自己的低频、高
准确度晶振,用以维持一个RTC时钟、RTC定时器和中断控制单元。其中中断控制单元使RTc定时
器和外部设备能够唤醒挂起的系统。
2.3设备电源管理
在某些设备闲置时可以被主动关闭,从而节电。
在2.6内核中需要实现总线以及设备的电源管理支持,在驱动中需要实现设备驱动的suspend/resume
函数。
关闭一个设备。其驱动的su8pend方法需要两
个不同的调用,一个用来保存状态.另外一个用来关
闭设备电源。相反,resume方法需要一个调用用来
给设备供电,另一个调用来恢复设备的状态。在关
闭一个总线设备时必须关闭所有的下一级子设备。
相反地,重新使能总线设备时,必须先使能根设备,然后再使能子设备。
3android电源管理
Android智能手机平台的操作系统仍然是
UNUx,只是在LINuX内核的基础上增加了Android
相关的驱动,也就是UNux的蹦ve璐目录下的an.
droid,其中包括alann。binder。pmem,power,timed—gpio等模块。
Power模块就是针对Andmid智能手机平台的
电源管理模块,也是应用和驱动结合的模块。An.
droid的电源管理和标准UNUX的电源管理还是有
很大的差别。
标准uNux的电源管理接口:
echo’’standby”>/8y&/power/state
echo”mem’’>/sy&/power/stateecho”deepsleep”>/sy∥poweI./stateAndroid的电源管理接口:
echo”standby”>/sy&/android—power/reque3【一State
echo’’wake”>/sys/andmid—power/request—statecat/sy∥蛐droid—power/acquire—panial—wake—Iock
cat/sys/andmid—power/rele踮e—wakejock
cat/sys/android-power/reque虬一state接下来从Java应用层面,Andmidframework层
面,“nux内核层面分别进行详细讨论:
3.1Java应用层面
Android提供了现成的aJldroid.os.PowerManag.
er类,该类用于控制设备电源状态的切换。该类对
外有三个接口函数:
VoidgoTosleep(10ngtime);//强制设备进入
S1eep状态
newwakeLock(intnags,Stringtag);//取得相
应层次的锁
万方数据・68・微处理机2011年
voiduserActivity(10ngwhen,booleaIlnoChange一
“ghts).//u¥eractivit)r事件发生,设备会被切换到
Fullon状态,同时ResetScreenofftimer.
3.2Androidframework层面
Framework层面主要代码文件如下:
fhmeworks\base\core\iava\andmid\os\Power—
MaIlager.jaVafhmeworks\base\sen五ces\iava、com\锄droid、
server、P0werManagersen,ice.java
fhmeworks\base\core、java、锄droid\os\P0wer.
jaVaf}帅eworks\base\cor℃\jni\android—os—power.cpp
hardware\libhar(1ware\power\power.c其中PowerManage焉enrice.java是核心,Power.
java提供底层的函数接口,与JNI层进行交互,JNI
层的代码主要在文件andmid—os—Power.cpp中,与Linu)【kemel交互是通过P0wer.c来实现的,Andriod
跟Kemel的交互主要是通过sys文件的方式来实现
的,具体请参考Kemel层的介绍。
3.3“nux内核层面
Android的电源管理主要是通过Wakekk来
实现的,在最底层主要通过如下三个队列来实现其
管理:
staticLIsT—HEAD(gjnactivejocks);
staticLIST—HEAD(g—actiVe—panial—wake—locks);
staticLIST—HEAD(&Jctive-fhU二wakejocks);
所有初始化后的kk都会被插入到g-iIlactive一10cks队列中,而当前活动的p枷alwakelock都会被
插入到g—active—paItial—wake_10cks队列中,活动的
fuUwakelock被插入到g—active—fuU—wake—kks队
列中,所有的p叭ialwakelock和fuUwakelock在过
期后或unlock后都会被移到inactive队列,等待下次调用。
在Kemel层使用wakelock步骤如下:
(1)调用函数android-in“一8uspenQ_lock初始化一个wakelock(2)调用相关申请kk的函数android—kk—
suspend司£andl-oid—lock—suspend—auto—expiIe请求‰k,这里只能申请partialwakelock,如果要申请FuUwakelock,则需要调用函数android—lock—partial
?uspend—auto—expire(该函数没有E)(PORT出来),这个命名有点奇怪,不要跟前面的androidjock—sus—
pend_auto.expire搞混了o
(3)如果是autoexpire的wakelock则可以忽
略,不然则必须及时把相关的wakelock释放掉,否
则会造成系统长期运行在高功耗状态。
(4)在驱动卸载或不再使用Wakelock时请记
住及时调用andmid_unin“一suspenQ—lock释放资源。系统有三种状态:usER—AwAl@(FuUonsta—tus);USER—NOTIFICATION(EadysuspendeddriVer
butCPUkeepon);USER—SLEEP(CPUentersleepmode)。系统正常开机后进入到AWAKE状态,Backli曲t会从最亮慢慢调节到用户设定的亮度,系
统screen硪timer(settings一>sound&display一>
Disphysettings一>screentimeout)开始计时,在计
时时间到之前,如果有任何的activit)r事件发生,如
T0uchclick,keyboardpressed等事件,则将Reset
screenofftimer,系统保持在AwAKE状态。如果有
应用程序在这段时间内申请了FuUwakelock,那么
系统也将保持在AWAKE状态,除非用户按下power
key。在AwAKE状态下如果电池电量低或者是用
AC供电8creeno珏timer时间到并且选中Keep
screenonwhileplugedin选项,backli出t会被强制调
节到DIM状态。
如果screenofftimer时间到并且没有FuUwake
lock或者用户按了powerkey,那么系统状态将被切
换到NOTIFICAl'ION,并且调用所有已经注册的¨ady—suspenQ—handlers函数,通常会把LCD和
Backlight驱动注册成eadysuspend类型,如有需要
也可以把别的驱动注册成earlysuspend,这样就会
在第一阶段被关闭。接下来系统会判断是否有
panialwakelockacquired,如果有则等待其释放,在等待过程中如果有useractivity事件发生,系统则马
上回到AwAKE状态;如果没有panialwakelockac.quired,则系统会马上调用函数pm—suspend关闭其
它相关的驱动,让CPu进入休眠状态。
系统在Sleep状态时如果检测到任何一个
wakeupsource,则CPu会从Sleep状态被唤醒,并且
调用相关驱动的resume函数,接下来马上调用前期
注册的edysuspend驱动的resume函数,最后系统
状态回到AWAKE状态。
Android与标准Linux休眠的区别:
pm—suspend()虽然会调用enter—state()来进
万方数据