一、healthd
1.1 init new了一个service并且加入到servicemanager中
healthd_mode_ops->init = healthd_mode_android_init
gBatteryPropertiesRegistrar = new BatteryPropertiesRegistrar();
gBatteryPropertiesRegistrar->publish();
1.2 helathd用 epoll 监听两个fd ,都用于更新电池电量相关信息
一个power_supply相关的ueventfd:
healthd_register_event(uevent_fd, uevent_event)
一个 wakealarm_fd 相关的定时器:
healthd_register_event(wakealarm_fd, wakealarm_event)
uevent_event | wakealarm_event
healthd_battery_update
gBatteryMonitor->update() -> BatteryMonitor::update
读取psy相关sys节点的属性值赋值给 props 结构变量
...
healthd_mode_ops->battery_update(&props); // 对应三个不同mode的ops :android_ops 、charger_ops 、recovery_ops
gBatteryPropertiesRegistrar->notifyListeners(*props);
BatteryPropertiesRegistrar::notifyListeners // 通知listener ☆
mListeners[i]->batteryPropertiesChanged(props); // 回调listener里面的回调函数
二、BatteryService.java 中注册lisenter,复写变化方法
final IBatteryPropertiesRegistrar batteryPropertiesRegistrar = IBatteryPropertiesRegistrar.Stub.asInterface(b);
batteryPropertiesRegistrar.registerListener(new BatteryListener()); // 注册 listener ☆
// BatteryService中复写listener变化调用的方法 ☆
private final class BatteryListener extends IBatteryPropertiesListener.Stub {
@Override
public void batteryPropertiesChanged(BatteryProperties props) {
final long identity = Binder.clearCallingIdentity();
try {
BatteryService.this.update(props);
} finally {
Binder.restoreCallingIdentity(identity);
}
}
}