ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

低功耗开发工程师核心技能解析:从安卓到嵌入式实战指南

低功耗开发工程师核心技能解析:从安卓到嵌入式实战指南 1. 功耗岗位到底在做什么先搞懂工作边界很多刚入行或者准备转岗的朋友一看到低功耗开发工程师这个岗位就发怵觉得门槛高、方向冷门。其实这个岗位没有想象中那么神秘它本质上解决的就是一个核心问题让设备在有限的电池容量下跑得更久、发热更少、体验更稳。不管是手机、手表、耳机、门锁、传感器节点还是车载中控只要带电池或者对功耗有严格要求的设备都需要低功耗开发。在安卓体系里它是系统性能优化的一部分在嵌入式体系里它是固件设计的基本功。两者工作内容不同但底层思维是相通的都是围绕能量去哪了、能不能少用、能不能用完赶紧睡这三件事展开。从岗位职责来看安卓方向的功耗工程师主要跟系统框架、内核 wakeup source、电源管理服务打交道关注的是 App 的耗电排行、系统唤醒源、Doze 模式、后台定位、网络请求对齐这些偏上层的策略。嵌入式方向的功耗工程师则要深入到底层关注 MCU 的睡眠模式、外设上下电时序、时钟树规划、电源域划分、RTOS 的空闲任务钩子这些偏硬件紧密相关的细节。两者需要掌握的知识范围差异很大但有一个共同点都要会测量、会分析、会看数据。如果你只会写业务代码从没看过功耗曲线那在面试中一聊就知道是纸上谈兵。所以这篇文章我会把这两条线都串起来从岗位需求、工作内容、核心技能到实操方法尽量用一篇文章讲透让你知道该往哪个方向使力。2. 功耗岗位的能力模型拆解从硬件基础到系统分析2.1 硬件层面看懂电路图是最低门槛别被软件工程师也要看电路图这句话吓到。功耗岗位看电路图跟硬件工程师看电路图是两码事你不需要会设计原理图、不需要懂 PCB 布局但你要能从原理图中找到跟功耗相关的关键器件和测试点。首先是电源树Power Tree也就是整块板子的供电拓扑。你要能顺着电池接口、充电 IC、PMIC电源管理芯片、各路 DCDC 和 LDO 的输出一路看到每个负载器件。为什么要看这个因为排查耗电问题时你得知道哪个器件挂在哪路电源上才能快速判断这路电流异常是因为负载漏电还是电源配置不对。其次是关键信号。在原理图上找到 Vbat 检测点、PMIC 的 Regulator 输出引脚、电池温度检测引脚以及各负载的供电使能引脚EN 脚。这些测试点在样机调试阶段会被接到功耗仪、示波器或者数据采集器上。刚入行的时候多花点时间把原理图和 PCB 位号图对照着看做到看到位号就知道它在电源树的哪一级这个能力会在后面所有功耗分析工作中被反复用到。还有一点容易被忽视就是电池本身。不同电芯的放电曲线差异挺大同样的设备、同样的代码换一块电池测出来的续航可能差 10% 以上。功耗开发至少要知道电池的标称容量、放电截止电压、内阻和充电策略这些参数会直接影响你制定功耗指标的基准。我之前见过有同事排查待机耗电查了一个星期最后发现是测试用的老化电池自放电严重白白浪费了时间。2.2 系统层面功耗问题的本质是状态管理问题从系统层面看功耗优化的本质就是状态管理。低功耗的精髓只有一个字睡。能睡多深睡多深能睡多久睡多久睡之前把该关的都关了醒过来把该开的都开了。在安卓系统里这个睡体现在 CPU 的 idle 状态、系统的 Suspend-To-RAM、Doze 模式、App Standby 等机制上。在嵌入式 RTOS 里体现为 Tickless 模式、WFIWait For Interrupt指令、睡眠唤醒事件配置。但不管是哪个平台都要回答这几个问题系统什么时候允许进入睡眠睡眠前要保存什么状态、关闭什么外设哪些事件可以唤醒系统唤醒之后怎么快速恢复需要多久功耗岗位的核心工作内容之一就是把上面这些问题在具体设备上编码出来。这要求你不仅会写驱动、会配内核还要能看懂系统的电源状态机是怎么流转的。比如安卓内核里的 suspend 流程它会依次调用 suspend notifier、freeze 进程、suspend devices、进入 sleep任何一个环节返回 busy系统就无法真正休眠功耗自然降不下去。另外一个常见的误区是把省电简单理解为降低 CPU 频率。降压降频确实是省电手段但它省的是运行功耗而移动设备大量场景下是待机功耗在拖后腿——屏幕关了、App 还在后台跑、网络还在间歇收发数据、传感器还在一秒采样十次。这部分浪费远比 CPU 频率造成的浪费更隐蔽也更容易成为面试中的核心考察点。3. 安卓低功耗方向四大核心工作板块3.1 耗电数据采集与归因分析安卓功耗工程师每天接触最多的不是代码而是数据。拿到一台手机或者开发板第一步就是采集耗电数据然后回答电到底花在哪了。常用的工具链有这几条Battery Historian谷歌出品的耗电分析工具它能把 bugreport 里的耗电信息解析成可视化的时间轴可以看到 CPU 唤醒、网络活动、传感器使用、wakelock 持有时间这些关键维度。它的核心价值不是告诉你哪个 App 最耗电而是告诉你某个时刻系统为什么醒着。dumpsys batterystats命令行版本的耗电统计可以查看每个 App 的耗电排名、wakelock 统计、网络流量统计、Alarm 统计。对工程师来说它的信息密度比 Battery Historian 还要高适合在脚本里自动抓取分析。dumpsys power查看电源管理状态包括 Display、Wakefulness、mWakeLockSummary 等关键状态值。排查屏幕关了还在耗电的问题时这个命令是首选。dumpsys deviceidleDoze 模式的白名单、强制空闲状态、light/depth idle 配置都从这里看。实际工作中拿到问题机器后我一般这样操作先清空电池统计dumpsys batterystats --reset然后复现耗电场景比如待机一晚上或者播放一小时视频再导出 bugreport用 Battery Historian 做初步分析用 dumpsys 命令做精确确认最后定位到具体的唤醒源、具体进程、具体驱动。3.2 Wakelock 与唤醒源治理WakeLock 是安卓系统里最经典、也最容易出问题的一个电源管理机制。它本质上是 App 或者系统服务向 PowerManager 申请的一个锁持有锁期间系统不能进入休眠状态。合理使用没有问题但一旦使用不当——比如忘记释放、持有时间过长、持锁做耗时操作——就会导致设备无法休眠待机功耗直接飙升。监听用户无操作时设备本来可以睡 8 小时只掉 2% 电但如果有某个应用持锁不放可能一晚上掉 15%。这种问题用 Battery Historian 一眼就能看出来CPU 活动时间轴在待机时段依然是密集的条状而正常的曲线应该是短促唤醒后快速变为空白。排查 WakeLock 问题时几个关键命令要熟记于心adb shell dumpsys power | grep -A 200 Wake Locks: adb shell dumpsys batterystats --wakeups adb shell dumpsys battery_stats | grep -i wakelock同时要理解两个层面的锁用户空间通过 PowerManager API 加锁锁的统计信息在dumpsys power里能看到内核层面有 Wakeup Source它记录的是哪个中断源、哪个驱动模块唤醒了系统通过/sys/kernel/debug/wakeup_sources接口查看里面有 active_ms、total_time_ms 这些关键字段用来判断某个唤醒源是否异常频繁。治理策略上安卓系统的常规做法是限制后台 App 拿锁。从 Android 6.0 的 Doze 到 Android 8.0 的后台执行限制再到 Android 12 的 foregroundService 启动限制系统在一步步收紧 App 在后台的电源使用权限。作为功耗工程师你既要会应用这些系统限制也要会判断哪些场景需要放行。比如导航 App 在后台需要定位音乐 App 在后台需要播放这些都是通过白名单、前台服务或者特殊 App 机制来豁免的。3.3 Doze 模式与后台策略调优Doze 模式是 Android 6.0 引入的省电机制核心思路是设备静止且屏幕关闭一段时间后系统会限制 App 访问网络、延迟后台任务、限制 WakeLock 和 Alarm。到 Android 7.0 之后演进为轻度和深度两级 Doze。功耗工程师要做的不是让系统更激进地杀后台而是在省电和功能性之间找到一个合理的平衡点。做消息推送的 App如果被 Doze 限制得太严推送就会延迟打车的 App 如果在后台深度休眠乘客下单后司机看不到订单。所以实际工作中要不断调整配置、验证场景、收集数据。和功耗相关的主要配置在 AOSP 里集中在这几个位置config.xml里的config_dozeComponent、config_deviceIdleComponent等DeviceIdleController.java里的大量超时参数LIGHT_AFTER_INACTIVE_TIMEOUT、DEEP_IDLE_AFTER_INACTIVE_TIMEOUT、IDLE_PENDING_TIMEOUT等白名单机制系统级白名单在config_deviceIdleWhitelist里配置App 级白名单可以通过PowerManager.isDeviceIdleMode()和requestIgnoreBatteryOptimizations来申请调优的时候使用下面的命令可以快速验证 Doze 是否按预期工作# 强制进入 idle 模式 adb shell dumpsys deviceidle force-idle # 退出 idle adb shell dumpsys deviceidle unforce # 查看当前各 App 的 idle 状态 adb shell dumpsys deviceidle whitelist很多新手在做 Doze 验证的时候都会遇到一个问题强制进入 idle 之后发现某些外设还在工作。这通常不是因为 Doze 没生效而是该外设驱动注册了唤醒源或者外设的电源没有被正确关断。遇到这种情况别急着调参先把代码逻辑捋一遍确认外设的 suspend/resume 回调是真的执行了。3.4 温控与性能功耗平衡功耗和性能天然是一对矛盾体。CPU 跑得越快功耗越高发热越大发热到一定程度热损耗又会反过来降低电池的放电效率。安卓系统里的温控机制Thermal 框架就是在性能和温升之间找平衡。高通平台上有thermal-engine负责根据温度传感器的读数调整 CPU/GPU 频率、限制充电电流、控制屏幕亮度。展讯平台、MTK 平台也各有各的温控策略。作为功耗工程师你不一定要写这些策略但你要能通过cat /sys/class/thermal/thermal_zone*/temp查看温度要能看懂dumpsys thermalservice的输出要能理解温控触发后系统会降频、会推迟后台任务这会直接影响功耗测试的数据。功耗和性能的平衡体现在具体需求上就是场景化功耗同样是看视频在 Wi-Fi 下和 5G 下的功耗目标应该不一样同样是待机弱信号场景的待机功耗就允许比强信号场景高一些。这些指标通常在项目立项阶段就要定好功耗工程师的职责之一就是在开发阶段通过调度策略、DVFSDynamic Voltage and Frequency Scaling、任务迁移等手段努力达到这些指标。4. 嵌入式低功耗方向从裸机到 RTOS 的实战要点4.1 硬件功耗模型先搞清楚设备什么时候在耗电嵌入式方向的功耗工作首先要建立一个设备功耗模型——不是说用 Excel 拉个表格就行而是要在你的脑子里形成一张图设备在正常工作时、浅睡眠时、深睡眠时每一路电源、每一个外设、每一颗芯片分别是什么状态、消耗多少电流。举个最常见的 MCU 物联网设备的例子设备工作在 Active 模式主控运行在 48MHzLoRa 模块处于发射状态电流可能到 120mA设备进入 Sleep 模式MCU 运行在 32.768kHz 低速时钟LoRa 模块进入 Sleep传感器停止采样电流能掉到 50uA 以下设备进入 Deep SleepMCU 只保持 RTC 走时RAM 数据不保留绝大多数外设断电电流可以做到 5uA 以内。这三个数字之间的差距是几千倍。低功耗开发的核心任务就是让设备尽量多地待在第 2、3 状态并且从状态 3 唤醒后能够快速完成工作再睡回去。用一句话总结就是功耗优化的本质是时间规划——在正确的时间做最少的事做完就睡而不是一直醒着等。在实际项目中我会先做一张表格把设备所有可能的状态列出来注明每个状态下的工作频率、工作电压、电流估算值、可以停留的最长时间。这张表既是设计文档也是后续优化功耗的对照基线。没有这张表你连功耗高了多少都说不清楚。4.2 MCU 低功耗的六个常用手段嵌入式低功耗的手段说来说去就那么多但每个手段都有坑。我挑六个问得最多、也最容易出问题的点展开讲讲。1. 睡眠模式选择。不同 MCU 的睡眠模式差别很大。以 STM32 为例有 Sleep、Stop、Standby 三种模式。Sleep 模式下内核停止但外设和时钟都还在省电效果有限Stop 模式关掉了大部分时钟SRAM 和寄存器数据保留唤醒速度比较快Standby 模式接近断电只有备份域和 RTC 还在工作唤醒后相当于复位重启。选哪种模式取决于你的唤醒源和唤醒后是否需要保留 RAM 数据。很多新手一上来就选最深的睡眠模式结果发现唤醒后所有状态都没了程序逻辑全乱反而得不偿失。2. 时钟规划。低功耗设备建议用外部 32.768kHz 晶振给 RTC 提供独立的低速时钟这样在 MCU 主时钟停止后RTC 仍能走时并且可以作为定时唤醒源。同时要留意有些 MCU 的内部 LSI低速内部时钟与外部晶振的精度差异较大如果设备需要在特定时间点唤醒比如每天固定时间上报数据最好用外部晶振做 RTC 时钟源否则累计误差在长时间运行后会被放大。3. 外设电源管理。传感器、通信模块Wi-Fi、LoRa、BLE、LCD、指示灯这些外设是功耗的大头。设计上要做到每个外设的电源都可由 MCU 的 GPIO 控制通过负载开关或 MOSFET在不使用时彻底断电芯片本身有 Sleep 模式的先让进入 Sleep再断电双保险。之前调试一颗气体传感器手册上写着 Sleep 模式电流 1uA结果实测有 300uA查了半天发现是它的 I2C 上拉电阻在芯片 Sleep 后仍然接到了 VCC形成漏电通路。后来在外设电源路径上加了一个 P-MOS 管做彻底断电功耗才真正降下来。4. 中断唤醒与事件唤醒。在睡眠前要仔细配置唤醒源外部 GPIO 中断可以唤醒RTC 闹钟可以唤醒串口空闲中断在某些 MCU 上也可以唤醒。但要注意中断引脚的电平状态——如果外部信号在睡眠期间出现毛刺或者引脚内部上拉/下拉配置不当可能导致设备被频繁唤醒实际平均功耗反而更高。用示波器抓一下唤醒引脚的波形确保唤醒源信号干净、稳定是排查这类问题最直接的方法。5. RTOS 的空闲任务钩子。在 FreeRTOS 里空闲任务Idle Task的钩子函数是低功耗的入口。经典写法是在钩子里执行__WFI()Wait For Interrupt指令让 CPU 在没有任务可跑的时候进入休眠等待中断。更进阶的做法是配合 Tickless 模式在进入空闲时关掉不必要的 SysTick 周期中断让系统在低功耗模式下长时间待机直到外部事件或者 RTC 唤醒。这里有一个常见的坑如果某个任务没有正确地阻塞等待比如用vTaskDelay或者队列接收的超时参数设置不当空闲钩子可能长时间无法执行设备就永远是清醒的。6. 外设模块的点灯调试陷阱。很多工程师在调试低功耗时喜欢用翻转 LED、串口打印的方式加日志。这本身没问题但一定要记得在测量功耗前把这些调试功能全部关闭或移除。我见过一个项目软件工程师在低功耗模式下加了一个 100ms 周期的 LED 闪烁用来指示现在处于低功耗结果这个 LED 的电流直接让整机功耗超标 20%。调试用的代码不要让它埋在正式逻辑里功耗测试前一定要过一遍。4.3 测量与验证没有仪器就没有话语权嵌入式功耗工程师必须学会用仪器至少要学会三种工具万用表测量静态电流、平均电流。用万用表测低功耗电流时有个坑大多数万用表的电流挡在低量程下内阻较大可能导致被测设备电压跌落影响正常工作。所以测量前先确认万用表的内阻和压降对于 uA 级别的电流优先使用具有高分辨率的专业电流表或者微安级钳形表。示波器 电流探头观测瞬态电流波形。比如 BLE 广播的电流脉冲、LoRa 发射瞬间的电流尖峰、系统从睡眠到唤醒的电流突变这些信息万用表看不出来示波器一抓一个准。看瞬态波形时重点看脉冲的宽度、幅度、频率对比协议规范计算平均功耗是否合理。功耗分析仪如 Nordic PPK2、Joulescope、Otii目前嵌入式功耗开发最推荐的测量工具。这类仪器专为低功耗设备设计可以长时间连续记录电流曲线并且支持通过上位机软件圈选时间段、计算平均电流、导出 CSV 数据。调试无线传感器设备时用功耗分析仪测一个完整的工作周期唤醒-采集-处理-发送-睡眠直接能看到哪个阶段电流超了非常直观。验证环节有个经验不要在开发板上测功耗要在最终形态的产品板上测。开发板上有一堆调试芯片、LED、电平转换电路这些都会消耗额外的电流测出来的数据跟实际产品可能差好几倍。功耗验证越贴近量产状态的数据越有参考价值。5. 功耗问题的排查实战三个典型案例复盘5.1 案例一安卓设备一晚上待机掉电 12%症状某安卓平板Wi-Fi 待机一晚8 小时电量从 80% 掉到 68%明显超标。排查过程第一步用adb shell dumpsys batterystats --reset清零统计第二步确保设备充满电并断开充电器屏幕关闭后放置过夜第三天早上抓取 bugreport用 Battery Historian 打开时间轴。很快发现 CPU 活动在深夜有两个明显的高频活动段指向某预装的应用商店。进一步dumpsys power查看 WakeLock 历史发现这个 App 持有一个 PARTIAL_WAKE_LOCK 长达三小时。解决方案该 App 自身有 bug在检测到系统进入空闲后没有及时释放 wakelock。修复方式不是在系统侧粗暴地杀掉这个进程而是推动应用团队升级。同时在系统侧把该 App 加入 Doze 白名单之外的限制策略force-stop 模式下禁止运行作为临时缓解。排查这类问题最忌讳的就是看一眼电池-耗电排行直接下结论某某 App 耗电一定要结合唤醒锁和时间轴数据做交叉确认。5.2 案例二嵌入式设备待机电流比规格高了 20 倍症状某带 NB-IoT 模块的环境监测设备标称待机电流 30uA实测 650uA。排查过程先断开所有外设只保留 MCU 最小系统待机电流恢复正常说明问题出在外设侧。逐个给外设上电测试发现温湿度传感器单独工作时待机电流就偏高。查看芯片手册发现传感器的测量模式下有一个配置寄存器如果测量结束后没有主动写入 Sleep 命令芯片会自动进入连续测量模式而不是我预期的 Sleep 模式。修正固件在每次采样完成后主动配置 Sleep 模式待机电流降到了 2uA 左右。这个案例的教训是不要相信芯片手册上的默认状态要用实测数据确认芯片进入睡眠后是否真的达到标称功耗。很多传感器芯片的auto sleep功能需要额外配置或者默认并没有开启。同时软件上要设计用完即睡的机制不要依赖硬件的自动休眠。5.3 案例三低功耗唤醒后偶尔死机症状设备在 RTC 定时唤醒后运行一段时间会偶发死机复位重启后才恢复。而且不是每次唤醒都死机大约 5% 的概率很难稳定复现。排查过程初期怀疑是电源不稳但示波器抓唤醒瞬间的电源波形没有发现明显跌落。后来在代码里排查唤醒后的初始化流程发现唤醒后直接调用了某个通信外设的初始化函数而该外设在上一次睡眠前的 deinit 流程中有一个等待外设忙状态的循环因为超时条件配置错误导致外设其实没有完全停止就被断掉了时钟。唤醒后外设处于一个未定义的状态初始化时读取寄存器返回错误值进入异常分支最终触发看门狗复位。修复方案修正 deinit 流程中的超时判断逻辑确保外设完全停止后再进入睡眠同时在唤醒后的初始化函数里加入外设状态的完整重置。这种问题排查费时间但能积累很多经验。低功耗代码最考细节一个看起来没啥问题的时序可能在极端条件下变成定时炸弹。6. 面试通关指南功耗岗位的考点与项目经验准备6.1 最高频的六个面试问题不管是校招还是社招功耗岗位的面试题难度通常不会特别深但覆盖面很广。根据我这些年面试候选人的经验下面 6 个问题出现的频率最高1. 进程 A 持有 WakeLock 不放系统会发生什么怎么办考点WakeLock 的作用、PowerManager 的机制、Wakelock 超时选项的设置、避免持锁过久的工程手段。2. Android 的 Doze 模式有哪几种状态App 如何适配考点对 Doze 机制的理解、白名单机制、setExactAndAllowWhileIdle的使用限制、前台服务的合理使用。3. 嵌入式设备常用的睡眠模式有哪些区别是什么考点MCU 低功耗模式的理解比如 STM32 的 Sleep/Stop/StandbynRF52 的 System ON/System OFF 模式等。4. 你如何测量一块板子的待机电流考点仪器使用、测试环境搭建、避免测量误差的方法以及是否做过真实的低功耗测量项目。5. 你的项目里遇到过最难的功耗问题是什么怎么解决的考点真实项目经验、问题排查思路、数据驱动的分析方法。6. 如果设备在低温环境下电池续航明显缩短可能的原因是什么考点电池低温特性、内阻变大、系统低温保护策略、功耗管理和温控的联动。面试时切忌背概念。面试官更想听到的是你实际做过什么、遇到过什么坑、怎么定位问题而不是你背下来多少名词。准备一两个完整的项目案例把背景、问题、排查过程、测量数据、解决方案、最终效果串联清楚比死记硬背一百个知识点都管用。6.2 学习路线建议三个月入门到能干活如果你是从零开始准备功耗方向岗位我建议按下面这条路线走。别贪多每一步做扎实了再往后推进。第一阶段第 1-2 周建立基础认知。学习数字电路基础看懂电阻、电容、MOSFET 的开关作用了解 MCU 的时钟树、GPIO 配置、中断系统学会看原理图和 datasheet。目标拿到一块开发板能画出它的电源树简图。第二阶段第 3-6 周掌握一个平台的低功耗开发。推荐先学 STM32 或者 ESP32。把官方低功耗例程跑通实测 Sleep/Stop/Deep Sleep 模式的电流做一个小项目比如电池供电的温湿度采集器用 RTC 定时唤醒采集完发送后立刻入睡把唤醒-工作-睡眠的完整流程走一遍。同时学会用功耗分析仪测量和记录电流曲线。第三阶段第 7-10 周进入安卓系统功耗方向。不用从零开始写系统先学会用工具。安装 AOSP 编译环境编译一个模拟器或者开发板镜像写一个小 App故意制造 wakelock 泄漏和 Alarm 频繁唤醒然后用 Battery Historian 和 dumpsys 抓到它。通过这种方式你会深刻理解系统侧工具如何暴露 App 的问题。有余力的话再研究frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java的核心流程。第四阶段第 11-12 周准备项目经验话术和面试。把你做过的实验、测过的数据、踩过的坑整理成文档。注意招人方最看重的是动手能力即使你之前的项目不是专门的功耗项目只要你在现有项目里做过延长待机降低发热这类工作都可以往功耗方向上包装。关键是你能说清楚数据、能展示结论、能经得起追问。7. 工具与学习资源清单工欲善其事必先利其器。功耗开发涉及的工具和资源比较分散这里整理一份实用清单。Android 方向Battery Historian耗电时间轴分析从 bugreport 生成可视化报告。Perfetto系统级 trace 工具可以分析 CPU、调度、Binder、电源相关的详细时间线适合做深度耗电归因。dumpsys 系列batterystats、power、deviceidle、alarm、location 这些命令是日常排查的主力。AOSP 源码重点关注 frameworks/base/services/core/java/com/android/server/power/ 和 kernel/power/。嵌入式方向STM32CubeMX可视化配置时钟、外设、低功耗模式生成初始化代码省去大量手工配置时间。Nordic Power Profiler Kit 2 (PPK2)目前我在用的主力测量工具支持 uA 级电流精准测量软件界面也能方便地做数据分析和导出。Joulescope如果你预算充足Joulescope 的精度和数据可视化能力更强适合深挖瞬态电流细节。FreeRTOS 官方文档重点看 Tickless 低功耗模式和空闲任务钩子的章节这部分内容是 RTOS 功耗开发的基础。通用资源芯片厂商的官方应用笔记。比如 ST 的《AN4666: Low-power modes on STM32》Nordic 的《Power Profile Optimization》这些文档把功耗设计的原理和坑点讲得很透彻。电池厂商的技术文档。了解锂电池的充放电特性和电压曲线做功耗指标评估时很有帮助。提示学工具不是目的会分析才是目的。很多人用 Battery Historian 只会看哪个 App 耗电多这是远远不够的。要能回答为什么它耗电多、它做了什么事导致耗电、系统有没有办法限制它才算是真正学会了这个工具。在动手做项目之前有一点务必要想清楚低功耗开发不是一个独立的方向它依附于真实的产品和场景。纯粹为了学低功耗而学低功耗很容易陷入背了一堆名词但不会用在真实项目中的困境。我个人的经验是哪怕从一个小项目开始——比如做一个纽扣电池供电的温湿度计、给旧的安卓手机做省电优化——只要完整走一遍设计-实现-测量-优化的闭环你对功耗开发的理解就会远超那些只看资料不动手的人。最后再分享一个我自己的小技巧做功耗测试时一定坚持写测试记录。日期、设备、固件版本、测试条件屏幕亮度、网络状态、传感器开关、测试时长、平均电流、最大电流、异常现象这些信息记录下来看起来琐碎但在定位间歇性问题和对比不同版本功耗表现时能救你的命。很多诡异的问题最后都是靠翻旧记录找到线索的。功耗开发拼的不是灵感而是严谨和耐心这行做久了你会发现每一个看似玄学的功耗问题背后都藏着一个明确的物理原因。找到它修掉它就是这份工作最有成就感的时候。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进