android6.0系统Healthd深入分析( 四 )


我们可以看到framework层中的BatteryService.JAVA的onStart函数中有如下代码:
public void onStart() { IBinder b = ServiceManager.getService("batteryproperties");final IBatteryPropertiesRegistrar batteryPropertiesRegistrar =IBatteryPropertiesRegistrar.Stub.asInterface(b);try {batteryPropertiesRegistrar.registerListener(new BatteryListener());} catch (RemoteException e) {// Should never happen.}我们在初始化的时候已经提到过,当healthd初始化时候会创建BatteryPropertiesRegistrar的对象并将其publish注册到系统服务中,注册服务的语句如下:
defaultServiceManager()->addService(String16("batteryproperties"), this);
所以BatteryService在这里获取该服务,并以此注册其监听器为BatteryListener(),该监听器监听到BatteryProperties改变便会调用到BatteryService的update函数,去做电池电量相关计算以及显示 。
至此更新操作基本分析完成,其简要流程如下图所示

android6.0系统Healthd深入分析

文章插图
 
总结Healthd是framework层传递来自底层电池事件信息并调用相关模块更新电池状态的一个中间层,其向下监听来自底层PMU驱动上报的uevent电池事件,向上调用BatteryService去计算电池,电量,使用等相关信息,它通过一个阻塞式的死循环不断监听底层三个文件节点上的事件信息,当监听到事件便调用到BatteryMonitor执行更新操作,通过BatteryService.java中注册监听电池属性改变的函数,当电池属性信息发生改变,即回调到BatteryService中做更新操作,更新完成一次电池事件的上报到更新整个流程就完成;总之Healthd是连接Battery模块framework中java层与HAL层交互的主要通道 。

【android6.0系统Healthd深入分析】


推荐阅读