1、功耗基础概念:Android系统功耗的物理基础、功耗单位与测量方法、功耗与性能的权衡关系
1.1 功耗的物理基础——能量不会凭空消失
做功耗优化,首先得明白电到底消耗在哪了。说白了,手机里的电流最终都转化成了热量。你想想看,手机打游戏发烫,那就是功耗在“现形”。
从物理层面讲,芯片功耗主要分两块:
- 动态功耗:电路翻转时产生的功耗。频率越高、电压越高、翻转越频繁,功耗就越大。公式是 P = C × V² × f。C是负载电容,V是电压,f是频率。
- 静态功耗:晶体管关断时漏掉的电流。工艺越先进(比如7nm、5nm),漏电越严重。手机待机时掉电快,很多时候就是静态功耗在作祟。
核心认知:动态功耗和电压的平方成正比。这意味着,降压比降频更划算。我在项目中遇到过,把CPU电压降50mV,功耗能降10%以上,而性能几乎没损失。
嗯,这里要注意。动态功耗和静态功耗不是孤立的。芯片温度升高,静态漏电会指数级增长。所以散热不好,功耗会越来越恶化。这就是所谓的“热 runaway”现象。
1.2 功耗单位与测量方法——你得知道怎么“称重”
功耗的单位很简单:瓦特(W)。但手机里常用的是毫瓦(mW)和微瓦(μW)。
| 单位 | 换算关系 | 典型场景 |
|---|---|---|
| 1 W | 1000 mW | 游戏场景、充电 |
| 1 mW | 1000 μW | 屏幕亮屏、WiFi连接 |
| 1 μW | 0.001 mW | 待机漏电、传感器 |
测量方法,我习惯分三种:
- 硬件级测量:用精密电源(如Agilent N6705B)直接给手机供电。精度高,能到μA级别。适合做整机功耗基线。
- 软件级测量:用adb命令读电池电流。比如
adb shell dumpsys battery。精度一般,但方便快捷。 - 芯片内部测量:高通、MTK平台都有内部的PMU(电源管理单元)寄存器。可以读到CPU、GPU、DDR等模块的实时功耗。
我的习惯:先用硬件测量定基线,再用软件测量做日常监控。遇到异常,再用芯片内部测量定位具体模块。三步走,效率最高。
我曾经踩过一个坑。用软件读电流时,发现待机功耗异常高。查了半天,原来是某个后台服务在轮询GPS。软件读数显示的是“平均电流”,但实际是脉冲式的。后来用示波器抓波形才真相大白。所以,软件读数只能做参考,不能全信。
1.3 功耗与性能的权衡——鱼和熊掌怎么兼得?
功耗和性能,天生就是一对冤家。你想跑得快,就得给芯片多喂电。但电喂多了,发热、续航崩。怎么平衡?
我总结了一个“黄金三角”:
- 性能:用户感知到的流畅度、响应速度
- 功耗:电池续航、发热
- 温度:芯片结温、外壳温度
这三者互相制约。性能高了,功耗涨,温度升。温度高了,芯片降频,性能反而掉。这就是典型的“热节流”。
避坑指南:我曾经优化一个游戏场景,把CPU频率拉满,帧率确实上去了。但玩了10分钟,手机烫到拿不住,系统强制降频,帧率直接腰斩。用户反馈更差了。后来我学乖了,先定温度阈值,再调频率。宁可帧率稳在55fps,也不要冲60fps然后掉到30fps。
具体怎么权衡?我建议用“能效比”来衡量。能效比 = 性能 / 功耗。比如:
| 频率 | 性能(帧率) | 功耗(W) | 能效比 |
|---|---|---|---|
| 1.8 GHz | 55 fps | 3.5 W | 15.7 |
| 2.0 GHz | 60 fps | 4.8 W | 12.5 |
| 2.2 GHz | 62 fps | 6.2 W | 10.0 |
你看,1.8 GHz的能效比最高。虽然帧率不是最高,但每瓦特带来的性能提升最大。这就是“甜点频率”。
为什么会这样?因为频率越高,电压也得跟着涨。而功耗和电压是平方关系。所以高频段的功耗增长是指数级的,性能增长却是线性的。说白了,跑在甜点频率上,才是真正的“聪明”优化。
总结一句话:功耗优化的本质,不是一味省电,而是找到性能和功耗的平衡点。让用户感觉“流畅又不烫”,这才是高手。
嗯,这一章先讲到这里。下一章我们聊聊Android系统的功耗架构,看看电到底是怎么从电池流到各个模块的。