BatteryStatsService电池电量统计服务分析

BatteryStatsService主要负责电池电量的统计信息,首先我们简单的看下电量统计服务的启动过程。

BatteryStatsService启动过程

AA

从BatteryStatsService的启动时序图可以看出,BatteryStatsService服务是在ActivityManagerService服务中启动的

1. 在SystemServer中startBootstrapServices()方法中创建了ActivityManagerService服务的对象,并调用了SystemServiceManager的startService()方法启动了BatteryStatsService服务

首先分析BatteryStatsService的构造方法

mStats = new BatteryStatsImpl(systemDir, handler, mHandler);

构造方法中创建了一个BatterystatsImpl对象,BatteryStatsService真正的处理逻辑其实都是在BatteryStatsImpl类中。

在BatteryStatsImpl类的构造函数中首先创建了一个文件

if (systemDir != null) {
            mFile = new JournaledFile(new File(systemDir, "batterystats.bin"),
                    new File(systemDir, "batterystats.bin.tmp"));
        } else {
            mFile = null;
        }

在手机的data/system/目录下创建一个batterystats.bin文件

该文件用于保存BatteryStats电量的统计信息,系统会不定时的将电量统计信息BatteryStats写入到文件中。

然后在构造函数中初始化了mScreenOnTimer,mPhoneOnTimer,

WifiOnTimer等一系列的StopWatchTimer,这些Timer主要用于统计各种模块耗电的时间。

2.在ActivityManagerService服务的构造方法中创建了BatteryStatsService服务的对象,调用了readLocked()方法读取电池统计信息,初始化BatteryStats

3.调用BatteryStatsService的initPwerManagerment()方法初始化电量统计服务,将BatteryStatsService服务注册到ServiceManager中

 

收集、存储电量统计信息

收集有很多的硬件模块,CPU、显示屏、WiFi、蓝牙、闪光灯等,在Android系统中,手机的电压是一定的,所以手机的电量计算就是模块使用时间*模块耗电。

其中关键就是模块使用时间的统计。电量信息的收集在内存中是有BatteryStats来描述的,由于收集的电量会从不同的维度来计算,所以该类设计的比较复杂。

电量收集的关系图。

BB

在BatterystatsService中有很多note*** 方法,这些方法就是 其他的模块调用用来统计相关的电量使用时间的。比如在PMS类中经常会有调用Notifier类相关的方法来进行通知,这些方法最终都会调用到BatteryStatsService中note***方法来通知该服务统计电量信息

通过其中一个时间收集的例子来学习下模块电量时间收集的过程。

比如使用闪光灯的时间收集过程。

 /frameworks/av/services/camera/libcameraservice/CameraService.cpp类中。

使用闪光灯的时候会调用notifier.noteFlashlightOn(

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值