BatteryService与PMS之间的关系比较密切,提供接口用于获取电池信息、充电状态等。
为了对Android的功耗控制有更深入的了解,我们有必要分析一下BatteryService。
一、启动过程
BatteryService与系统中的许多服务一样,是由SystemServer启动的。
我们一起看看SystemServer中相关的代码:
..............
//PMS是在startBootstrapServices中创建的
startBootstrapServices();
//BatteryService在startCoreServices中创建的
startCoreServices();
..............
跟进一下startCoreServices:
private void startCoreServices() {
mSystemServiceManager.startService(BatteryService.class);
..................
}
之前的博客分析过SystemServiceManager的startService方法。
该方法主要通过反射的方式创建出对应的服务,
然后,将服务保存在SystemServiceManager的mServices变量中,
最后,调用服务对应的onStart方法。
我们不再赘述SystemServiceManager固有启动服务的流程,直接来看看本篇博客的主角BatteryService相关的代码。
1、BatteryService的构造函数
public BatteryService(Context context) {
super(context);
mContext = context;
mHandler = new Handler(true /*async*/);
//内部类Led,控制不同电量下led灯的颜色
mLed = new Led(context, getLocalService(LightsManager.class));
//电量统计服务
mBatteryStats = BatteryStatsService.getService();
//以下是根据配置文件,定义不同电量对应的等级
//电池危急的电量;当电池电量低于此值时,将强制关机
mCriticalBatteryLevel = mContext.getResources().getInteger(
com.android.internal.R.integer.config_criticalBatteryWarningLevel);
//低电警告的电量;当电池电量低于此值时,系统报警,例如闪烁LED灯等
mLowBatteryWarningLevel = mContext.getResources().getInteger(
com.android.internal.R.integer.config_lowBatteryWarningLevel);
//关闭低电警告的电量;当电池电量高于此值时,结束低电状态,停止警示灯
mLowBatteryCloseWarningLevel = mLowBatteryWarningLevel + mContext.getResources().getInteger(
com.android.internal.R.integer.config_lowBatteryCloseWarningBump);
//这里定义的不再是电量,而是关闭电池的温度(温度失控,就会出现三星S7爆炸啥的......)
mShutdownBatteryTemperature = mContext.getResources().getInteger(
com.android.internal.R.integer.config_shutdownBatteryTemperature);
// watch for invalid charger messages if the invalid_charger switch exists
// 监控终端是否连接不匹配的充电器
if (new File("/sys/devices/virtual/switch/invalid_charger/state").exists()) {
UEventObserver invalidChargerObserver = new UEventObserver() {
@Override
public void onUEvent(UEvent event) {
final int invalidCharger = "1".equals(event.get("SWITCH_STATE")) ? 1 : 0;
synchronized (mLock) {
if (mInvalidCharger != invalidCharger) {
mInvalidCharger = invalidCharger;
}
}
}
};
invalidChargerObserver.startObserving(
"DEVPATH=/devices/virtual/switch/invalid_charger");
}
}
从上面的代码可以看出,整体来看BatteryService构造函数是比较简单的,主要的目的就是得到一些变量。
2、onStart函数
接下来我们看看BatteryService的onStart函数:
public void onStart() {
//获取电源属性服务的BinderProxy对象
//电源属性服务运行在android的healthd进程中
//对应文件为system/core/healthd/BatteryPropertiesRegistrar.cpp
//这个写法确实很风骚,java层通过Binder直接与native层通信
IBinder b = ServiceManager.getService("batteryproperties");
final IBatteryPropertiesRegistrar batteryPropertiesRegistrar =
IBatteryPropertiesRegistrar.Stub.asInterface(b);
try {
//向电源属性服务注册一个回调接口
//当电源属性发生变化时,BatteryListener的batteryPropertiesChanged函数将被调用
batteryPropertiesRegistrar.registerListener(new BatteryListener());
} catch (RemoteException e) {
// Should never happen.
}
mBinderService = new BinderService();
//与PMS等很多系统服务一样,将自己注册到service manager进程中
publishBinderService("battery", mBinderService);
//之前介绍PMS时,提到过这个函数
//对于基于LocalServices管理的对象而言,这个函数调用相当于单例模式的进阶版
//以后BatteryManagerInternal接口类型的对象,只能有BatteryService的内部类LocalService一个
publishLocalService(BatteryManagerInternal.class, new LocalService());
}
从以上代码可以看出,BatteryService在onStart函数中主要完成一些服务注册、接口注册的工作。
2.1 BatteryPropertiesRegistrar服务
我们看看BatteryPropertiesRegistrar.h的定义:
.......
namespace android {
class BatteryPropertiesRegist