Android电池

Android电池系列一:Android电池概述

手机健康状态

Android 电池,或者说 Android 电池服务,是 Android 一个非常重要的服务,从上层到底层到驱动硬件,都需要电池服务的踪影。Android 电池服务完成的功能包括:电池管理,电池状态,电源计算。电池管理主要包括省电等,电池状态主要包括剩余电量,充电状态等,电源统计主要包括估计可使用时间等。因为电池是手机等电源供应的唯一来源,所以,电池信息非常重要,需要实时同步到设备用户。可以想象,如果手机快没电了,用户也不知道,是多么恐怖的一件事情。

现在的手机耗电都比较快,很多手机都是一天一冲,所以,续航是现在手机的一大通病。由于电池蓄电技术和手机体积本身的限制,无限提高电池用量可谓很难。要延长手机的续航,如果省电,就成了一门学问,尤其是手机设备厂商。当然,APP 开发也需要考虑功耗问题,如果一款 APP 一小时能把电池耗完,这个 APP 谁敢用(特殊除外)?

初步了解电池

我们先了解电池的基本信息,如电池的容量,电池的充电状态,电池的技术(结构)等。目睹为快,你可以直接看手机电池的说明,一般有电池品牌,电池容量,额定电压等信息。但是目前大多数手机都是“一体机”,根本看不到电池。

我们平时看得最多的便是手机上状态栏的电池剩余电量图标,如下图所示

Android 电池类型 电池 安卓_java

或者到手机的设置-电池 查看估计剩余使用时间,和耗电的详情,如下图所示

Android 电池类型 电池 安卓_手机电池数据_02

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 的框架基本蓝图。