如果能访问google:
直接浏览器打开
Battery Historian
https://batterystats.unicode.org.cn/
-------------Linux-----------
参考 https://developer.android.com/studio/profile/battery-historian?hl=zh_cn
Install Docker Engine on Ubuntu | Docker Docs
Index of linux/ubuntu/dists/xenial/pool/stable/amd64/
三个deb都安装
验证是否安装好
sudo docker run hello-world
运行
docker run -p port_number:9999 gcr.io/android-battery-historian/stable:3.0 --port 9999
然后 在 浏览器打开,http://localIP:port_number
比如 http://192.168.2.111:8888/
开始 battery统计前 运行
adb shell dumpsys batterystats --reset
结束后
adb shell dumpsys batterystats > batterystats.txt
--------------windows--------------
https://www.docker.com/products/docker-desktop/
Download Docker Desktop: windows amd64
Docker Desktop Installer.exe用管理员身份运行
打开 Docker Desktop → 右上角 齿轮(Settings)
左侧选 Resources → Advanced
找到 Disk image location(磁盘镜像位置),把它从 C 盘改成 D 盘
windows power shell管理员身份
wl --install
wsl --update
出现提示欢迎使用WSL, 欢迎使用Linux的Windows子系统
验证
wsl --status
wsl -l -v
android10以下
docker pull registry.cn-hangzhou.aliyuncs.com/xyz10/android-battery-historian:stable-3.0
docker run -d -p 9999:9999 registry.cn-hangzhou.aliyuncs.com/xyz10/android-battery-historian:stable-3.0
android11及以上
docker pull runcare/battery-historian
这一步如果有问题,打开 Docker Desktop 点右上角 齿轮(Settings)
. 左侧选 Docker Engine . 把右边 JSON 里加上 registry-mirrors(如果原来有就替换成下面这些更新的源):
json {
"registry-mirrors": [
"https://docker.xuanyuan.me",
"https://docker.1ms.run",
"https://docker.1panel.live",
"https://hub.rat.dev"
]
}
docker run -d -p 9999:9999 runcare/battery-historian
http://localhost:9999/
----------
设置 → 开发者选项 → 点“Bug 报告”/“Bug 报告快捷方式”,会弹出三个选项:
互动报告(Interactive report):点击后才生成
完整报告(Full report):立即生成完整版
adb shell dumpsys batterystats --reset
# 单独导出更精简的分析文件
adb shell dumpsys batterystats > batterystats.txt
# 看历史(每段时间的耗电、唤醒、温度、屏幕状态)
adb shell dumpsys batterystats --history > history.txt
:: 1. 先开完整唤醒历史
adb shell dumpsys batterystats --enable full-wake-history
:: 2. (可选)重置,让数据从零开始,更干净
adb shell dumpsys batterystats --reset
:: 3. 用一段时间设备,然后导出
adb shell dumpsys batterystats > batterystats.txt
adb bugreportz
/data/user_de/0/com.android.shell/files/bugreports/bugreport...
注意首先查看手机底电流,一般在3mA以下,如果底电流不对的话,查查gpio配置和kernel log,需要硬件帮助,看看电路图有没有不正确的(如上拉下拉电阻是否有,漏电)。
关于电流大的问题,这个bugreport是最重要的,首先使用battery historian来分析
kernel log和main/system log也是必须的 (哪些经常打印,甚至有error, kernel log里的pm wakeup)
对于WiFi 最好能有air sniffer log和tcpdump
对于BT最好能有air sniffer log和hci dump
----
logcat
屏幕变化
screen_off
screen_on
电量变化
battery_level
BatteryController: onReceive:mLevel=58,mCharging=false
BatteryController: checkChargingMode batteryStatus BatteryStatus{status=3,level=58,plugged=1,chargingStatus=0,maxChargingWattage=-1} maxChargingMicroAmp 0 maxChargingMicroVolt 0
BatteryControllerLog: Processing BATTERY_CHANGED intent. level=58 scale=100
KeyguardIndication: refreshBatteryInfo isChargingOrFull:false powerPluggedIn:false batteryOverheated:false batteryLevel:59
KeyguardUpdateMonitorLog: handleBatteryUpdate: isNotNull: true BatteryStatus{status= 2, level=50, plugged=2, chargingStatus=0, maxChargingWattage= 7500000}
APP触发WIFI传输
BatteryStatsImpl: noteWifiRadioApWakeupLocked:uid
wakeup sources
Abort: Pending Wakeup Sources: xxx_rx_wakelock 强调「有一堆待释放的锁」,通常伴随多个唤醒源同时挂着
Abort: Last active Wakeup Source: xxxx_rx_wakelock 最近一个活跃的唤醒源是 WiFi 接收锁
Wakeup reason Abort: Device alarmtimer.0.auto failed to suspend: error -16: 1m 2s 4ms (24 times) realtime 系统想要进入休眠(suspend),但 alarmtimer 这个内核定时器子系统一直处于「忙」状态
下面两个可以看出是哪个APP导致的唤醒
+wake_lock=u0a155:"xxxx.WakerLock"
wakeupap=u0a155:""
1. 看「所有 App 的唤醒次数」—— 搜 wakeups
直接搜 wakeups,会定位到 batterystats 里的这段:
wakeupap=u0a155:"" wake up application 唤醒是为了哪个应用,把「内核唤醒」和「应用」关联起来的桥梁
2. 看「是谁在持锁」—— 搜 wake_lock
搜 wake_lock=,能看到哪个 UID 持了什么锁。
wake_lock=u0a155:"xxx.WakerLock"
3. 看「唤醒原因」—— 搜 wake_reason
搜 wake_reason,看底层唤醒源(sdiohal_irq、rtc 等)。
4. 看「唤醒源统计」—— 搜 Wakeup Sources 或 WakeupInfo
搜 WakeupInfo 或 Abort,看内核休眠失败的具体唤醒源。
5. 看「WiFi 射频开关」—— 搜 wifi_radio
搜 wifi_radio,+wifi_radio 是开、-wifi_radio 是关。这是 WiFi 唤醒的直接证据。
Wifi radio 有颜色(绿) WiFi 射频被激活(radio on,处于可收发状态)
6. 看「某个具体应用」—— 搜包名
能看到这个应用在整份日志里的所有出现位置(广播、进程、唤醒等)。
wakeups(App 唤醒次数)、wifi_radio(WiFi 开关)、wake_lock(持锁)、wake_reason(唤醒原因)、WakeupInfo(内核唤醒源)
u0a155:
Wi-Fi network: 1.08MB received, 850.50KB sent (packets 2623 received, 4500 sent)
WiFi AP wakeups: 71
WiFi Rx time: 1s 613ms (0.0%)
WiFi Tx time: 766ms (0.0%)
Wake lock *alarm*: 33ms partial (9 times) max=18 actual=65 realtime
Wake lock MicroMsg.WakerLock: 2m 38s 94ms partial (273 times) max=1039 actual=274400 realtime
TOTAL wake: 2m 38s 162ms blamed partial, 4m 34s 542ms actual partial realtime
Foreground services: 16h 8m 17s 62ms realtime (1 times) (running)
Fg Service for: 16h 8m 17s 62ms
DUMP OF SERVICE battery: 电池基本信息
DUMP OF SERVICE batterystats: 电池统计主数据
Battery History 电池历史事件(时间线)
Estimated power use (mAh) 各应用耗电排行
dumpsys jobscheduler → 看有没有周期任务(15 分钟级的)
dumpsys alarm → 看有没有 15 秒级的 alarm(这个更可能)
第 1 层:设备睡了没有(最关键) 看 suspend / resume(休眠/唤醒) 的切换。关键字: suspend / resume / PM: suspend / abort
• 如果 suspend 后很快又 resume,说明频繁被唤醒 • 如果出现大量 abort,说明想睡但被拦住
第 2 层:谁把设备叫醒了
看 wake_reason 和 wakeup source。关键字:
wake_reason / Wakeup Sources / WakeupInfo / wakeupap
第 3 层:谁在持锁不让睡
wake_lock / wakelock / suspend blocker
1. 先看「唤醒统计」—— 搜 wakeups u0a155: 29 wakeups:
谁的 wakeups 次数多,谁就是唤醒大户。
2. 看「唤醒原因分布」—— 搜 wake_reason wake_reason=0:"67 sdiohal_irq" ← 1028次(WiFi中断)
wake_reason=0:"...rtc@200" ← 139次(闹钟)
统计哪种 wake_reason 最多,就知道是 WiFi、闹钟还是别的在唤醒。
3. 看「持锁情况」—— 搜 Wake lock .xxxLock: 2m18s (185 times)
谁持锁次数多、时间长,谁就是「不让设备睡」的元凶。
4. 看「前台服务」—— 搜 Foreground services Foreground services: 18h38m31s (3 times)
灭屏后还常驻前台服务,是耗电的重要信号。
5. 看「Doze 状态」—— 搜 Doze 或 deviceidle mState=ACTIVE / INACTIVE / IDLE / IDLE_MAINTENANCE
设备有没有进入 Doze 深度休眠,以及谁打断了 Doze。
Battery Historian 里怎么看
Kernel only uptime 内核被唤醒的时间(越少越好)
Userspace wakelock 用户空间唤醒锁(越少越好)
Jobscheduler 越少越好
Doze 是否进入 Doze,被谁打断 Doze 行的蓝色部分就表示「设备进入了 Doze 模式」。
Wifi radio / scan WiFi 是否频繁活动 Wifi radio 有颜色(绿) WiFi 射频被激活(radio on,处于可收发状态)
Wakeup reasons(如果有) 唤醒原因
System Stats:
Device's Power Estimates: 看哪个app耗电多
Userspace Wakelocks: 看哪个应用wakelock时间长
JobScheduler Jobs: 看哪个应用有job scheduler时间长
WiFi Traffic Per App: 看哪个应用Wifi传输时间长
Kernel Wakeup Reasons: 看kernel哪个中断时间长
App Wakeup Alarms: app wakeup次数
History Stats:
WakeupReasonSummary: 看内核wake up原因,哪个中断
Apps Stats:
Network Information:
Wifi data transfersed/Wifi packets transferred/Num of Wifi radio wakeup
Wakelocks:
Wakeup alarm info:
Process info: foreground service
ACTIVE(活跃)
↓ 灭屏 + 静止一段时间
Doze / DEVICE_IDLE(浅度休眠)
↓ 进一步静止
Deep Doze(深度休眠)
↓ 内核层面
Suspend(真正挂起,CPU 停止) ← 最省电