BatteryStatsService主要负责电池电量的统计信息,首先我们简单的看下电量统计服务的启动过程。
BatteryStatsService启动过程
从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来描述的,由于收集的电量会从不同的维度来计算,所以该类设计的比较复杂。
电量收集的关系图。
在BatterystatsService中有很多note*** 方法,这些方法就是 其他的模块调用用来统计相关的电量使用时间的。比如在PMS类中经常会有调用Notifier类相关的方法来进行通知,这些方法最终都会调用到BatteryStatsService中note***方法来通知该服务统计电量信息
通过其中一个时间收集的例子来学习下模块电量时间收集的过程。
比如使用闪光灯的时间收集过程。
在 /frameworks/av/services/camera/libcameraservice/CameraService.cpp类中。
使用闪光灯的时候会调用notifier.noteFlashlightOn(