充电状态异常分析
最近项目上遇到一个问题,问题描述如下:
没有插入充电器的情况下状态栏充电动画在跑
借此机会,梳理了充电的流程,本文受限于篇幅,不会列出具体代码细节,阐述大致的流程,以后日后遇到类似问题,有分析和排查的思路。
完整flow如下:
Step1
Charger 收到 plugin or plugout的interrupt,调用battery_callback()
Step2
battery_callback()透过battery_update()调用power_supply_changed()
Step3
这里的power_supply_changed()位于drivers\power\power_supply_core.c这支文件中,作用是向用户空间发送 uevent并更新sys/class/power_supply/battery/status 节点。
Step4
当 sys/class/power_supply/battery/status 节点更新了, BatteryMonitor.cpp监听uevent 的部分会update,这里的update里会调用到healthd_mode_ops->battery_update(&props)用来notify batteryservice中注册的监听器。注意这里的参数对应BatteryProperties,正是要传给BatteryService的数据。
Step5
batteryservice中注册监听的回调会被触发,这时候拿到BatteryProperties这个数据包,调用update最终会调用到sendIntentLocked这个方法,该方法中做的是发送广播给所有监听电池状态变化的监听者,一般对应的是监听了这个广播的所有应用程序
注1:
这里BatteryMonitor.cpp对应的是healthd部分
从Android 4.4开始,Google专门提供了一个healthd来监控电源状态。它的路径在:system/core/healthd,编译出来的文件为/sbin/healthd,healthd是Android平台电量管理的一部分。
在Android平台中电池电量数据是通过驱动节点的形式提供给用户空间层,所以上层要获得手机电池相关的硬件数据只需要去读取文件节点数据即可,healthd进程就是负责读取值并把读取的结果通过通知给上层。
注2:
提供给用户的接口 sys/class/power_supply是通过 drivers\power\power_supply_core.c 中的power_supply_register创建的。Power Supply驱动程序与用户空间的接口是正是sys文件系统。
mtk kernel日志中需要关注的关键点如下:
plug in log:
[56:pmic_thread]: mtk_charger_int_handler
判断充电器类型log:
[243:charger_thread]: mtk_is_charger_on plug in, tyupe:1
battery_callback log:
[243:charger_thread]: battery_callback:1
healthd上报开始充电:
[366:healthd]: healthd: wsg update--after props.batteryStatus 2
另外,kernel日志中搜索关键字healthd,可以查看healthd中的状态
下面这张图,大概描述了整个流程
image图片资源摘自互联网