前言
加量不加价,更新来一波
整体框图
不记得从哪保存的好图了
硬件/内核相关
相关概念
懒的排版了,直接上图
相关文件关系
再来一发
杂项,电池温度检测原理图
发
充电流程
图样图森破
核心函数特写
Android 相关
Healthd 就是一個 daemon service,取代以前的 battery JNI ,
1.定期讀取 sys/class/power_supply 的檔案, 包含所有關於電池的必要資訊(電壓, 電流, 溫度,狀態 etc)
2.將上述讀取的資訊寫入至 battery property, 讓 android battery Service update
Healthd 启动流程
// system\core\rootdir\init.rc
service healthd /sbin/healthd
class core
critical
seclabel u:r:healthd:s0
group root system wakelock
// 对应的代码路径为:
// Healthd.cpp (system\core\healthd)
int main(int argc, char **argv)
//
// 1. 根据不同的启动模式,设置 healthd_mode_ops 为不同的操作函数集
// 当开机充电时变量赋值为 &android_ops,关机充电时候变量赋值为 &charger_ops
//healthd_mode_ops = &android_ops;
//
// 2.用 epoll 监听了:
// 1. Binder 通信事件
// 2. 定时器事件
// 3. Netlink 实现的 uevent 事件
// 然后遍历 /sys/class/power_supply/ 下的结点,设置全局变量 healthd_config
//ret = healthd_init();
// // 创建了一个 epoll 轮询象
// epollfd = epoll_create(MAX_EPOLL_EVENTS);
// // 这里就开机充电的情况下分析,调用 android_ops->init()
// // 主要是进行了 Binder 相关初始化,并注册了一个服务 "batteryproperties"
// // 到 servicemanager 中进行管理
// healthd_mode_ops->init(&healthd_config);
//
// // 主要是创建了一个定时器,24小时执行一次?
// wakealarm_init();
//
// // 用 epoll 监听 netlink 上报的 uevent 事件
// uevent_init();
//
// // 创建 BatteryMonitor 的对象,并将其初始化。BatteryMonitor
// // 主要接受 healthd 传来的数据,做电池状态的计算并更新
// gBatteryMonitor = new BatteryMonitor();
//
// // 主要是根据路径下节点设置全局变量 healthd_config
// // POWER_SUPPLY_SYSFS_PATH 定义为 "/sys/class/power_supply",
// // 在 init 函数中打开系统该文件夹,然后一一读取该文件夹下的文
// // 件内容,在 while 循环中判断该文件夹下各个文件节点的内容,
// // 并将其初始化给相关的参数
// gBatteryMonitor->init(&healthd_config);
//
//
// 3. 死循环,
// 监听 epoll 事件,并调用相应的回调函数进行处理:
// 1> uevent_event() 处理内核 Netlink 上报的数据
// // 当 sys 属性变化时,写入 log, 通知监听者
// 2> wakealarm_event(): 处理定时器唤醒
// 3> binder_event(): 处理 Binder 通信
// 如果没有事件,则根据 sys 属性变化,写入 log, 通知监听者 BatteryPropertiesRegistrar::notifyListeners()
//healthd_mainloop();
BatteryService
接口:frameworks\base\core\java\com\android\internal\app\IBatteryStats.aidl
【初始化流程】
zygote
SystemServer
// 入口函数
main(String[] args)
new SystemServer().run();
startBootstrapServices();
startCoreServices();
mSystemServiceManager.startService(BatteryService.class);
// frameworks\base\services\core\java\com\android\server\SystemServiceManager.java
// 创建一个继承 SystemService 的子类
public <T extends SystemService> T startService(Class<T> serviceClass)
// 获得 Class 名称
final String name = serviceClass.getName();
// 获得构造函数: public BatteryService(Context context)
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
// 调用构造函数,创建类对象
service = constructor.newInstance(mContext);
///
// frameworks\base\services\core\java\com\android\server\BatteryService.java
BatteryService::BatteryService()
// LED 灯光显示
mLed = new Led(context, getLocalService(LightsManager.class));
// 相关警告电量配置
// 添加到链表中进行管理
mServices.add(service);
// 启动服务
service.onStart();
// frameworks\base\services\core\java\com\android\server\BatteryService.java
public void onStart()
// 1. 首先将电池监听注册到底层去, 底层电量变化,会【调用 update()】
IBinder b = ServiceManager.getService("batteryproperties");
final IBatteryPropertiesRegistrar batteryPropertiesRegistrar = IBatteryPropertiesRegistrar.Stub.asInterface(b);
//电池监听,注册到底层。当底层电量改变会调用此监听。然后执行 update
batteryPropertiesRegistrar.registerListener(new BatteryListener());
///
// 2. 如果是 IPO 开关机的话,需要监听广播
if (SystemProperties.get("ro.mtk_ipo_support").equals("1")) 。。。
// 3. 将本地接口 publish 出去,
// 创建一个内部类 BinderService 对象
mBinderService = new BinderService();
底层电量更新流程
// 当底层电池状态更新时,healthd 会回调 BatteryPropertiesRegistrar::notifyListeners()
// 而此类是通过 Binder 通信注册了回调的,当有事件时会调用回调 update():
// IBinder b = ServiceManager.getService("batteryproperties"); // BatteryPropertiesRegistrar.cpp 注册的
// final IBatteryPropertiesRegistrar batteryPropertiesRegistrar = IBatteryPropertiesRegistrar.Stub.asInterface(b);
// batteryPropertiesRegistrar.registerListener(new BatteryListener());
private final class BatteryListener extends IBatteryPropertiesListener.Stub
BatteryService.this.update(props);
processValuesLocked(false);
// //解析充电类型
if (mBatteryProps.chargerAcOnline) 。。。
// 充电指示灯更新
mLed.updateLightsLocked();
// 没电了
shutdownIfNoPowerLocked();
// 温度过高
shutdownIfOverTempLocked();
// 发送电池状态变化的广播
sendIntentLocked();
#什么!还要了解?请看源码
地址:链接: http://pan.baidu.com/s/1kV3DKNX 密码: uiyb