Android电池
Android电池系列一:Android电池概述
手机健康状态
Android 电池,或者说 Android 电池服务,是 Android 一个非常重要的服务,从上层到底层到驱动硬件,都需要电池服务的踪影。Android 电池服务完成的功能包括:电池管理,电池状态,电源计算。电池管理主要包括省电等,电池状态主要包括剩余电量,充电状态等,电源统计主要包括估计可使用时间等。因为电池是手机等电源供应的唯一来源,所以,电池信息非常重要,需要实时同步到设备用户。可以想象,如果手机快没电了,用户也不知道,是多么恐怖的一件事情。
现在的手机耗电都比较快,很多手机都是一天一冲,所以,续航是现在手机的一大通病。由于电池蓄电技术和手机体积本身的限制,无限提高电池用量可谓很难。要延长手机的续航,如果省电,就成了一门学问,尤其是手机设备厂商。当然,APP 开发也需要考虑功耗问题,如果一款 APP 一小时能把电池耗完,这个 APP 谁敢用(特殊除外)?
初步了解电池
我们先了解电池的基本信息,如电池的容量,电池的充电状态,电池的技术(结构)等。目睹为快,你可以直接看手机电池的说明,一般有电池品牌,电池容量,额定电压等信息。但是目前大多数手机都是“一体机”,根本看不到电池。
我们平时看得最多的便是手机上状态栏的电池剩余电量图标,如下图所示
或者到手机的设置-电池 查看估计剩余使用时间,和耗电的详情,如下图所示
Dump电池数据
和电池相关的系统服务有三个,分别是:
- battery
- batteryproperties
- batterystats
你可以通过打开手机调试连接电脑,通过命令 adb shell dumpsys + service_name dump 电池信息。
第一个服务,dump 目前电池状态,如下:
adb shell dumpsys battery
Current Battery Service state:
AC powered: false //是否连接充电器
USB powered: true //是否连接USB充电
Wireless powered: false //是否连接无线充电
Max charging current: 0 //最大充电电流
Max charging voltage: 0 //最大充电电压
Charge counter: 0 //
status: 5 //电池状态,5:电池已满 2:正充电 4:不充电
health: 2 //健康状态,2:良好 3:过热 4:无用的 5:超压 7:温度过低 1、6:不明
present: true //
level: 100 //电量百分比
scale: 100 //百分比比例,一般都是0-100
voltage: 4402 //电压
temperature: 310 //温度
technology: Li-ion //电池结构,锂离子电池
Dump battery 对应的是系统的 BatteryService,在 dumpInternal() 方法中输出,后续的文章会展开阐述这个系统服务。
第二个服务,dump 电池属性,如下
adb shell dumpsys batteryproperties
ac: 0
usb: 1
wireless: 0
current_max: 0
voltage_max: 0
status: 5
health: 2
present: 1
level: 100
voltage: 4404
temp: 300
这里内容其实和第一个服务一样,只是这个 dump 下来的服务在 BatteryMonitor.cpp,在 dumpState() 中输出,是底层的服务。后续的文章会展开阐述这个系统服务。
第三个服务,dump 电池状态
adb shell dumpsys batterystats
这个 dump 下来的内容就很多了,主要包括:
- 电池用量等信息
- 电池耗电历史详情
- 应用 wakelock 持续时间
- 过往长久时间的耗电统计
- 最后一次充电以来所有耗电详情
- 估算电池可用时间
- 每个进程耗电的详情
由于内容过多,这里就不贴出来了,读者可以找一台手机打开调试,连接电脑通过 adb shell dumpsys batterystats 查看。
Android电池框架
App 层:
1.SystemUI,主要通过接受广播(Action:Intent.ACTION_BATTERY_CHANGED)更新状态,后续文章会阐述这个广播,System UI 如果更新这个状态就不再阐述了,读者可以阅读文章《SystemUI架构分析》了解SystemUI。
2.Setitngs,上面的图片所示。
Framework
主要代码包括:
- frameworks/base/core/java/android/os/BatteryManager.java
- frameworks/base/core/java/android/os/BatteryStats.java
- frameworks/base/services/core/java/com/android/server/BatteryService.java
- frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
Native
- system/core/healthd/healthd.cpp
- system/core/healthd/BatteryMonitor.cpp
- system/core/healthd/BatteryPropertiesRegistrar.cpp
- system/core/healthd/healthd_mode_android.cpp
总结
电池概述暂时阐述到这里,后续的文章将会对各个环节进行深入的探讨。本文主要简述了,如果获取电池信息,以及 Anroid 系统电池信息从内核 - Native - Framework - APP 的框架基本蓝图。