Android电源管理框架

本文详细介绍了Android电源管理框架的层次结构,从应用层、框架层、HAL层到Kernel层的功能,强调了PowerManagerService在电源管理中的核心作用,以及低功耗模式如早期暂停、暂停和休眠。此外,还探讨了用户活动如何影响系统休眠以及PowerManagerService的工作流程。
摘要由CSDN通过智能技术生成

Android电源管理框架

管理策略:通过锁和定时器来切换系统的状态,使系统的功耗降至最低


层次结构:App、Framework、HAL和kernel层

l  应用层:这里所谓的应用层主要是指应用程序和其他使用电源管理的Service,包括但不限于以下Services: PowerManagerService、BatteryService、LightService等。

l  框架层:在Android框架层包含了对应用层接口的API调用以及电源的协调工作,主要包含PowerManager.java、PowerManagerService.java、com_android_server_PowerManagerService.cpp、Power.java、android_os_Power.cpp。其中PowerManagerService.java是核心,Power.java提供底层的函数接口,与JNI层进行交互。PowerManager.java是提供给应用层调用的。android_os_power.cpp是jni交互文件。这一层的功能相对比较复杂,比如系统状态的切换,背光的调节及开关,Wake Lock的申请和释放等等,但这一层跟硬件平台无关。

l  HAL层:该层只有一个Power.c文件,该文件通过sysfs的方式与kernel进行通信。主要功能有申请wake_lock,释放wake_lock,设置屏幕状态等。用户空间的native库绝不能直接调用Android电源管理(见下图)。绕过Android运行时的电源管理政策,将破坏该系统。所有对电源管理的调用应通过Android的PowerManagerAPI来完成。

l  Kernel层:内核层的电源管理方案实现主要包含三部分:

1、Kernel/power/:实现了系统电源管理框架机制。

2、Arch/arm(ormips or powerpc)/mach-XXX/pm.c:实现对特定板的处理器电源管理。

3、drivers/power:是设备电源管理的基础框架,为驱动提供了电源管理接口。

Android的电源管理框架


Android系统提供的几个低功耗模式

earlysuspend:让设备进入低功耗,如LCD关闭

suspend:只有电源模块和

hibernation:内存镜像写入磁盘,下次开机可恢复


PowerManager是PMS的代理类,实现如下常用功能

reboot、gotoSleep、wakeUp、shutDown、isDeviceIdleMode、userActivity和屏幕信息操作等接口

userActivity:向PowerManagerService报告影响系统休眠的用户活动,重计算灭屏时间,背光亮度等,例如触屏,划屏,power键等用户活动;

isDeviceIdleMode:返回设备当前的状态,如果处于Idle状态,则返回true,Idle状态是在手机长时间没有被使用以及没有运动的情况下,手机进入到一种Doze低功耗的模式下,这种状态下手机可能会关掉网络数据访问,可以通过监视DEVICE_IDLE_MODE_CHANGED这个广播信息,来监控手机状态的改变


电源管理的核心服务PowerManagerService(PMS)流程

PowerManager是通过binder与PowerManagerService进行通信的,PowerManer中的大部分方法在PMS中都有阈值对应的方法,PMS是整个电源管理的决策系统

参考链接:

http://blog.csdn.net/gaugamela/article/details/52785041

http://www.myexception.cn/android/2076061.html

http://blog.csdn.net/kitty_landon/article/details/47107045

PMS:PowerNamagerService的启动

在SystemServer中启动PMS和SensorService

frameworks/base/services/java/com/android/server/SystemServer.java

private void startBootstrapServices()
{
  	mActivityManagerService = mSystemServiceManager.startService(
      	ActivityManagerService.Lifecycle.class).getService();
  	mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
  	mActivityManagerService.setInstaller(installer);
	
	mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);//启动PMS
	.......

	startSensorService();	//native函数,sensor管理
}

上面的函数为Android系统的引导程序,启动PMS时候会通过反射方式调用服务(PMS)的构造函数,同时执行服务(PMS)的onStart()函数

public <T extends SystemService> T startService(Class<T> serviceClass) {
         ......
                Constructor<T> constructor = serviceClass.getConstructor(Context.class);
                service = constructor.newInstance(mContext);//调用PMS的构造函数
         ......
                mServices.add(service);//将PMS作为系统服务添加到服务列表
                service.onStart();//调用PMS的onStart方法

         return service;
}

PMS的构造函数实现如下

    public PowerManagerService(Context context) {
        super(context);
        mContext = context;
        mHandlerThread = new ServiceThread(TAG,
                Process.THREAD_PRIORITY_DISPLAY, false /*allowIo*/);
        mHandlerThread.start();
        mHandler = new PowerManagerHandler(mHandlerThread.getLooper());

        synchronized (mLock) {
            mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService.WakeLocks");//控制C
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值