本文参考下面博文

本次学习battery的缘由是因为系统重启后在setting里没有了battery这项功能。而明明外接有电池,却不显示。

一、android电源管理结构

Android中的电池使用方式主要有三种:AC、USB、Battery 等不同的模式。在应用程序层次,通常包括了电池状态显示的功能。因此从 Android 系统的软件方面(包括驱动程序和用户空间内容)需要在一定程度上获得电池的状态,电池系统主要负责电池信息统计、显示。电池系统的架构如下所示:

android BatteryManager 怎么进行关闭充电 安卓battery_驱动程序


自下而上, Android 的电池系统分成以下几个部分

1、驱动程序:

特定硬件平台电池的驱动程序,用 Linux的Power Supply 驱动程序,实现向用户空间提供信息。Battery 驱动程序需要通过sys文件系 统向用户空间提供接口, sys文件系统的路径是由上层的程序指定的。Linux标准的 Power Supply驱动程序 所使用的文件系统路径为:/sys/class/power_supply ,其中的每个子目录表示一种能源供应设备的名称。

android BatteryManager 怎么进行关闭充电 安卓battery_android_02

Linux中驱动程序:power_supply

android BatteryManager 怎么进行关闭充电 安卓battery_android_03


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 会更新这些文件。传送信息到java

2、本地代码 - JNI

3 、JAVA 代码

setting中battery的字符串出处:

代码路径:

android-5.1-m200-mr1/packages/apps/Settings/res/values/strings.xml

android BatteryManager 怎么进行关闭充电 安卓battery_驱动程序_04


显示preference 的xml文件

android-5.1-m200-mr1/packages/apps/Settings/res/xml/power_usage_summary.xml

android BatteryManager 怎么进行关闭充电 安卓battery_驱动程序_05


加载preference 的xml文件

android-5.1-m200-mr1/packages/apps/Settings/src/com/android/settings/fuelgauge/PowerUsageSummary.java

android BatteryManager 怎么进行关闭充电 安卓battery_驱动程序_06

android-5.1-m200-mr1/packages/apps/Settings/res/xml/dashboard_categories.xml

android BatteryManager 怎么进行关闭充电 安卓battery_android_07

android-5.1-m200-mr1/packages/apps/Settings/src/com/android/settings/SettingsActivity.java

android BatteryManager 怎么进行关闭充电 安卓battery_驱动程序_08

判断battery的present的值,如果为false,则去掉battery这项功能

android BatteryManager 怎么进行关闭充电 安卓battery_#define_09

接收广播,解析广播中的action,以及batteryPresent

android BatteryManager 怎么进行关闭充电 安卓battery_驱动程序_10

注册接收ACTION_BATTERY_CHANGED广播

android BatteryManager 怎么进行关闭充电 安卓battery_管理_11

framework层的batteryservice发送ACTION_BATTERY_CHANGED广播
frameworks/base/services/core/java/com/android/server/BatteryService.java

android BatteryManager 怎么进行关闭充电 安卓battery_驱动程序_12

二、Uevent部分
Uevent是内核通知android有状态变化的一种方法,比如USB线插入、拔出,电池电量变化等等。其本质是内核发送(可以通过socket)一个字符串,应用层(android)接收并解释该字符串,获取相应信息。如下图所示,如果其中有信息变化,uevent触发,做出相应的数更新。

android BatteryManager 怎么进行关闭充电 安卓battery_#define_13

adb shell进入android系统中执行dumpsys battery 可以显示电池的信息

如图所示:

android BatteryManager 怎么进行关闭充电 安卓battery_#define_14

battery的驱动代码

kernel-3.10.14/drivers/power/ricoh619-battery.c

android BatteryManager 怎么进行关闭充电 安卓battery_#define_15