[电池简易流程图片在附件中]
java代码:
frameworks/frameworks/base/services/java/com/android/server/Ba
tteryService.java
JNI代码:
frameworks/base/services/jni/com_android_server_BatteryService.
cpp
kernel driver代码
drivers/power/xx_battery.c
2、BatteryService
BatteryService作为电池及充电相关的服务: 监听Uevent、读取sysfs
里中的状态 、广播Intent.ACTION_BATTERY_CHANGED。
(1)、mUEventObserver
BatteryService实现了一个UevenObserver mUEventObserver。
uevent是Linux内核用来向用户空间主动上报事件的机制,对于JAVA程
序来说,只实现UEventObserver的虚函数onUEvent,然后注册即可。
private UEventObserver mUEventObserver = new UEventObserver(){ @Override public void onUEvent(UEventObserver.UEvent event){ update(); } }
BatteryService只关注power_supply的事件,所以在构造函数注册:
public BatteryService(Context context){ mContext = context; mBatteryStats = BatteryStatsService.getService(); mUEventObserver.startObserving("SUBSYSTEM=power_supply"); //set initial status update(); }
(2)、update()
update读取sysfs文件做到同步取得电池信息, 然后根据读到的状态更新
BatteryService的成员变量,并广播一个Intent来通知其它关注电源状态的
组件。
当kernel 有power_supply 事件上报时,mUEventObserver 调用
update()函数,然后update 调用native_update 从sysfs 中读取相关状态
(com_android_server_BatteryService.cpp):
private synchronized final void update(){ native_update(); }
(3)、sysfs
Linux驱动driver维护着保存电池信息的一组文件sysfs,供应用程序获
取电源相关状态:
#define AC_ONLINE_PATH "/sys/class/power_supply/ac/online" AC 电源连接
状态
#define USB_ONLINE_PATH "/sys/class/power_supply/usb/online" USB 电源
连接状态
#define BATTERY_STATUS_PATH
"/sys/class/power_supply/battery/status"充电状态
#define BATTERY_HEALTH_PATH
"/sys/class/power_supply/battery/health"电池状态
#define BATTERY_PRESENT_PATH
"/sys/class/power_supply/battery/present"使用状态
#define BATTERY_CAPACITY_PATH
"/sys/class/power_supply/battery/capacity"电池level
#define BATTERY_VOLTAGE_PATH
"/sys/class/power_supply/battery/batt_vol"电池电压
#define BATTERY_TEMPERATURE_PATH
"/sys/class/power_supply/battery/batt_temp"电池温度
#define BATTERY_TECHNOLOGY_PATH
"/sys/class/power_supply/battery/technology"电池技术
当电池状态发生变化时,driver会更新这些文件。