当前位置: 首页 > news >正文

Android 功耗分析(底层篇)

        最近在网上发现关于功耗分析系列的文章很少,介绍详细的更少,于是便想记录总结一下功耗分析的相关知识,有不对的地方希望大家多指出,互相学习。本系列分为底层篇和上层篇。

        大概从基础知识,测试手法,以及案例分析三个方面着手。

一、基础知识

底层篇主要介绍底电流的调试与分析。首先我们要明确什么是底电流,什么是待机电流。

1.1、概念

底电流:指机器完全睡眠时的最低电流。

待机电流:是指机器在待机一段时间内的平均电流,通常需要插卡进行测试。

1.2、为什么要测试底电流

主要目的是评估设备在最低功耗状态下的能耗表现,对于电池供电的设备(如手机、可穿戴设备、IoT 设备),底电流直接影响设备在长时间非使用场景下的待机时长。

  • 测量底电流是评估产品功耗指标是否符合设计要求的关键步骤。
  • 通过实际测量与设计目标对比,发现并解决功耗异常问题
  • 底电流测试可以帮助开发者发现硬件设计中的电流泄漏问题,例如:
    • 元器件未完全关闭。
    • 电路设计不合理导致的静态电流消耗。
  • 通过逐步排查电路中的模块,找到并优化功耗“热点。

测量底电流的最终目的是确保设备在低功耗状态下的能耗最小化。它不仅有助于排查和优化硬件设计,还能验证系统功耗策略的有效性,并最终延长设备的续航时间。对于任何需要长待机时间的电池驱动设备,底电流测试是不可或缺的一步。

二、底电流调试方法

这里主要介绍高通平台的调试方法。

2.1、首先要进行RF校准

射频QCN文件下载并进行射频校准。高通有专门的工具刷入机器里,因为QCN文件不下载射频不能正常工作,会引起漏电,继而引起底电流偏大。

2.2、排除其他因素

打开飞行模式,避免蓝牙、wifi、NFC、网络、FM等的一般影响。

关闭GPS,避免GPS对底电流的影响。

关闭自动旋转屏幕,排除sensor的影响。

关闭自动亮度,以及其他特效设置。

手动移除可以移除的所有外设以及驱动模块,例如:

lsmod

rmmod WLAN

2.3、进行待机测试

灭屏待机,连接power monitor 查看实时电流,分析机器是否进入睡眠状态,可以通过串口查看kernel日志,搜索关键字suspend entry查看是否进入睡眠。

2.4、分析kernel日志

kernel没有进入睡眠则查看是哪个模块引起的并有针对性分析相应模块。如果进入休眠电流还大,需要分析各个模块的clock有没有关闭。

2.5、抓取rpm dump日志进行分析

方法如下:

(1)ps_hold接地

在休眠状态下,接ps_hold到地少于200mS,机器会进入紧急下载状态,插入USB,QPST会自动得到memory dump,然后上传以下几个文件:

CODERAM.bin

MSGRAM.bin

DATARAM.bin

以及RPM_AAAAANAZR.elf(必须与机器的编译时间一致匹配的elf)

(2)改reset为download key

发这些命令改reset为download key:

 cd /sys/kernel/debug/spmi/spmi-0echo 0x844 > addressecho 4 > count # cat data 00840 -- -- -- -- 0F 07 04 00echo 0x00 0x00 0x01 0x00 > datacat data 00840 -- -- -- -- 00 00 01 00echo 0x00 0x00 0x01 0x80 > datacat data 00840 -- -- -- -- 00 00 01 80 

然后长按下键,会进入download。之后抓取log方法同上

如果进不了download,需要确认

CONFIG_MSM_DLOAD_MODE=y

2.6、查看rmp_stats的状态

检查rpm_stats是否进入vdd min或者xo/no shutdown。使用下面的命令检查rpm lower power mode count:

adb shell mount -t debugfs none /sys/kernel/debugadb cat /sys/kernel/debug/rpm_stats

如果vmin的count是0,则表明设备从来没有进入vdd min;non-zero则说明设备进入过vdd_min。

示例:

RPM Mode: xosdcount:0time in last mode(msec):0time since last mode(sec):794actual last sleep(msec):0RPM Mode:vmincount:11time in last mode(msec):0time since last mode(sec):359actual last sleep(msec):110000

可以dump出来完整详细的gpio/clk/pmic信息,排除休眠时候的状态异常。

2.7、查看modem是否休眠

可以通过检测TCXO引脚的状态来确定modem端是否休眠,在modem端tlmm_bsp.c文件下比对各个GPIO有无设置错误继而引起漏电。另外,sleep_target.c文件也值得分析。

三、待机电流优化

3.1、adb命令抓取日志

在优化前,我们需要通过日志来确定导致功耗偏高的原因。可以通过一些adb命令进行排查。

adb logcat -v time > YearMounthDayHourMinute_logcat.txt //main logadb logcat -v time -b events > YearMounthDayHourMinute_logcat_event.txt //event logadb logcat -v time -b radio > YearMounthDayHourMinute_logcat_radio.txt //radio logadb shell dmesg > YearMounthDayHourMinute_dmesg.txt //kernel log

抓取对应的日志

adb shell mount -t debugfs none /sys/kernel/debug 

用于将 debugfs 文件系统挂载到 Android 设备的 /sys/kernel/debug 目录,允许开发者访问内核的调试信息、性能数据和其他调试工具

adb shell "echo 8 > /proc/sys/kernel/printk"

将内核的日志级别设置为 8,使得内核输出最详细的调试信息

除了上述的方法,我们也可以使用如下命令来打开指定文件的kernel log(以qpnp-adc-tm.c和qpnp-adc-common.c为例):

adb shell "echo 'file qpnp-adc-tm.c +p' > /sys/kernel/debug/dynamic_debug/control"adb shell "echo 'file qpnp-adc-common.c +p' > /sys/kernel/debug/dynamic_debug/control"

我们也可以为指定的函数开启log

以qpnpint_handle_irq为例:

adb shell "echo 'func qpnpint_handle_irq +p' > /sys/kernel/debug/dynamic_debug/control" 

3.2、Top命令

使用

adb shell 
top

在待机的时候可以通过top命令查看是否有应用一直占用cpu,如果未主动开启该应用,但是却显示一直占用cpu,那么该应用的行为就存在异常。

3.3、查看唤醒源以及wakelock持锁

在调试wakeup的时候我们可以使用一下命令开启一些debug日志的信息。

(1)调试命令

3.3.1

mount -t debugfs none /sys/kernel/debug  echo 1 > /sys/kernel/debug/clk/debug_suspend  

用于启用内核中时钟管理的调试功能,主要帮助开发人员排查设备挂起/恢复过程中与时钟相关的问题,如底电流偏高、时钟未正确关闭等

3.3.2

echo 1 > /sys/module/msm_show_resume_irq/parameters/debug_mask 

用于在高通平台上启用中断(IRQ)唤醒调试功能,帮助开发者分析设备从挂起状态恢复过程中与中断相关的问题。这是调试底电流偏高、功耗问题或唤醒异常的重要工具之一,但需注意对性能和存储的影响,调试完成后建议关闭该功能。

3.3.3

echo 4 > /sys/module/wakelock/parameters/debug_mask

用于在 Android 内核中启用 wakelock 模块 的高级调试功能,记录唤醒锁的获取和释放情况

3.3.4

echo 1 > /sys/module/lpm_levels/parameters/debug_mask 

用于启用低功耗模式(LPM)模块的基本调试日志输出

3.3.5

echo 0x16 > /sys/module/smd/parameters/debug_mask  

用于启用高通平台 SMD(共享内存驱动) 的调试日志,主要用于分析设备间通信问题和优化功耗管理

(2)wakelock

1、wakeup_sources

在待机日志中,kernel层的wakelock和userspace的wakelock都有可能阻止系统休眠,所有的wakeup_sources均保存在sys节点/sys/kernel/debug/wakeup_sources里面。(该文件记录了wake sources的详细调试信息),这个文件包含了以下的信息:

a、the total amount of time a wakeup source has prevented suspend

当系统尝试进入休眠(suspend)时,某些唤醒源(如网络、传感器、应用程序等)可能会阻止这一过程

b、the amount of time a wakelock has been active since the last activation etc. The unit of time is milliseconds

每个唤醒源通常通过 wakelock(唤醒锁)机制防止系统休眠,表示唤醒锁最近一次被激活后,持续保持活跃的时间

2、active_since

active_since的值可以用来确认wakelock是否正在阻止休眠。如果该值不是零,那么这个wakelock正在工作并且阻止休眠

3、获取wakeup_source文件

adb root
adb shell
cat /sys/kernel/debug/wakeup_sources > /data/wakeup_sources.txtadb pull /data/wakeup_sources.txt

查看pull出来的wakeup sources.txt文件,查看active_since 不为0的项,即为阻止系统休眠的。

4、power:wakeup_source_activate 和 power:wakeup_source_deactivate events

当一个wakeup_sources被acquire和relerase的时候,通过启用 power:wakeup_source_activatepower:wakeup_source_deactivate 事件并记录到 trace buffer,可以记录wakeup source被driver使用的频率。

下面是开启该功能的方法。

echo "power:wakeup_source_activate power:wakeup_source_deactivate" > /sys/kernel/debug/tracing/set_event

The power:wakeup_source_activate and power:wakeup_source_deactivate events are written to the trace buffer any time a wakeup source is acquired or released and it can provide information on how often a wakeup source is being used by a driver. To enable these events, you can enable following: echo "power:wakeup_source_activate power:wakeup_source_deactivate" > /sys/kernel/debug/tracing/set_event Once the above done, the traces will be present in /sys/kernel/debug/tracing/trace.

解释如下:

  • 当唤醒源被某个驱动程序或模块 激活(acquired)释放(released) 时,内核会自动生成两个事件:

    • power:wakeup_source_activate:表示唤醒源被激活的事件。
    • power:wakeup_source_deactivate:表示唤醒源被释放的事件。
  • 这些事件会被记录到 trace buffer(内核调试追踪缓冲区)中,通过记录这些事件,可以统计每个唤醒源被驱动使用的频率,需要通过特定命令启用这些事件的记录功能

  • echo "power:wakeup_source_activate power:wakeup_source_deactivate" > /sys/kernel/debug/tracing/set_event

  • 启用事件后,所有记录的信息都会被保存到文件 /sys/kernel/debug/tracing/trace 中。

  • 作用
    通过查看该文件,可以实时了解唤醒源的活动记录。

(3)powertop

PowerTOP 是一个由 Intel 开发的 Linux 工具,用于诊断电量消耗和电源管理的问题。它可以帮助用户识别和优化系统中的电量消耗,从而延长笔记本电脑的电池寿命。PowerTOP 不仅可以作为一个诊断工具,还可以通过其交互模式启用各种电源管理设置,监控进程并展示电量消耗特别高的应用程序。

使用sudo apt install powertop 就可以安装了。

获取powertop log的方法:

  1. 通过USB连接手机到电脑

  2. adb shell,然后执行如下命令:

sleep 10 && /data/powertop [-r] -d -t 30 > /data/powertop.log &

  1. 拔掉USB线,等待10秒后开始功耗测试

  2. 插上USB

  3. adb pull /data/powertop.log

未完待续。。

相关文章:

Android 功耗分析(底层篇)

最近在网上发现关于功耗分析系列的文章很少,介绍详细的更少,于是便想记录总结一下功耗分析的相关知识,有不对的地方希望大家多指出,互相学习。本系列分为底层篇和上层篇。 大概从基础知识,测试手法,以及案例…...

【Xbim+C#】创建圆盘扫掠IfcSweptDiskSolid

基础回顾 https://blog.csdn.net/liqian_ken/article/details/143867404 https://blog.csdn.net/liqian_ken/article/details/114851319 效果图 代码示例 在前文基础上,增加一个工具方法: public static IfcProductDefinitionShape CreateDiskSolidSha…...

IntelliJ+SpringBoot项目实战(四)--快速上手数据库开发

对于新手学习SpringBoot开发,可能最急迫的事情就是尽快掌握数据库的开发。目前数据库开发主要流行使用Mybatis和Mybatis Plus,不过这2个框架对于新手而言需要一定的时间掌握,如果快速上手数据库开发,可以先按照本文介绍的方式使用JdbcTemplat…...

利用oss进行数据库和网站图片备份

1.背景 由于网站迁移到香港云 服务器,虽然便宜,但是宿主服务器时不时重启,为了预防不可控的因素导致网站资料丢失,所以想到用OSS 备份网站数据,bucket选择在香港地区创建,这样和你服务器传输会更快。 oss…...

Excel - VLOOKUP函数将指定列替换为字典值

背景:在根据各种复杂的口径导出报表数据时,因为关联的表较多、数据量较大,一行数据往往会存在三个以上的字典数据。 为了保证导出数据的效率,博主选择了导出字典code值后,在Excel中处理匹配字典值。在查询百度之后&am…...

实验室管理平台:Spring Boot技术构建

3系统分析 3.1可行性分析 通过对本实验室管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本实验室管理系统采用SSM框架,JAVA作为开发语言&a…...

操作系统进程和线程——针对实习面试

目录 操作系统进程和线程什么是进程和线程?进程和线程的区别?进程有哪些状态?什么是线程安全?如何实现线程安全?什么是线程安全?如何实现线程安全? 进程间的通信有哪几种方式?什么是…...

使用 cnpm 安装 Electron,才是正确快速的方法

当然,下面是总结的几种安装 Electron 的方法,包括使用 npm 和 cnpm,以及一些常见的问题解决技巧。 ### 1. 使用 npm 安装 Electron #### 步骤 1: 初始化项目 在你的项目目录中初始化一个新的 Node.js 项目: bash npm init -y …...

【人工智能】PyTorch、TensorFlow 和 Keras 全面解析与对比:深度学习框架的终极指南

文章目录 PyTorch 全面解析2.1 PyTorch 的发展历程2.2 PyTorch 的核心特点2.3 PyTorch 的应用场景 TensorFlow 全面解析3.1 TensorFlow 的发展历程3.2 TensorFlow 的核心特点3.3 TensorFlow 的应用场景 Keras 全面解析4.1 Keras 的发展历程4.2 Keras 的核心特点4.3 Keras 的应用…...

【第八课】Rust中的函数与方法

目录 前言 函数指针 函数当作另一个函数的参数 函数当作另一个函数的返回值 闭包 方法 关联函数 总结 前言 在前面几课中,我们都或多或少的接触到了rust中的函数,rust中的函数和其他语言的并没有什么不同,简单的语法不在这篇文章中赘…...

c语言学习25二维数组

1 二维数组 1.1二维数组认识 二维数组本质是一个数组。 举例: int a[10][3] 数组名 a; 元素个数10; 数组元素类型:int [3]; 数组元素下标:0~9 这是一个数组,有十个元素,每个元…...

如何理解Lua 使用虚拟堆栈

虚拟堆栈的基本概念 Lua使用虚拟堆栈来实现Lua和C(或其他宿主语言)之间的交互。这个虚拟堆栈是一个数据结构,用于存储Lua的值,如数字、字符串、表、函数等。它在Lua状态机(lua_State)内部维护,为…...

【倍数问题——同余系】

题目 代码 #include <bits/stdc.h> using namespace std; const int N 1e5 10, M 1e3 10; int maxx[M][4]; void consider(int r, int x) {if(x > maxx[r][1]){maxx[r][3] maxx[r][2];maxx[r][2] maxx[r][1];maxx[r][1] x;}else if(x > maxx[r][2]){maxx[…...

「San」监听DOM变化的方法

在 San框架 中监听组件内部字体大小并调整宽度&#xff0c;可以结合 自定义事件 或 数据绑定 来实现动态调整。San 框架没有直接的监听 DOM 尺寸变化的内置方法&#xff0c;但可以通过以下步骤实现&#xff1a; 方法一&#xff1a;使用 ResizeObserver 监听字体变化 在组件的 …...

如何选择服务器

如何选择服务器 选择服务器时应考虑以下几个关键因素&#xff1a; 性能需求。根据网站的预期流量和负载情况&#xff0c;选择合适的处理器、内存和存储容量。考虑网站是否需要处理大量动态内容或高分辨率媒体文件。 可扩展性。选择一个可以轻松扩展的服务器架构&#xff0c;以便…...

嵌入式驱动面试总结

操作系统&#xff1a; 中断的处理流程&#xff0c;中断处理需要注意些什么 软中断和硬中断区别 linux驱动用过那些锁&#xff0c;信号量&#xff0c;互斥锁 自旋锁和互斥锁的区别 二值信号量和互斥信号量有什么区别 进程锁怎么实现的&#xff0c;说一下流程&#xff1b; …...

Uniapp 简单配置鸿蒙

Uniapp 简单配置鸿蒙 前言下载并配置鸿蒙IDEHbuilder X 配置基本的信息生成相关证书登录官网获取证书IDE配置证书添加调试设备可能出现的问题前言 如今鸿蒙的盛起,作为多端开发的代表也是开始兼容鸿蒙应用的开发,接下来我将介绍如何在uniapp中配置鸿蒙。 注意:hbuilder X的…...

线程池的实现与应用

一、线程池 一种线程使用模式。线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用&#xff0c…...

基于Java Springboot单位考勤系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…...

近源渗透|HID ATTACK从0到1

前言 对于“近源渗透”这一术语&#xff0c;相信大家已经不再感到陌生。它涉及通过伪装、社会工程学等手段&#xff0c;实地侵入企业办公区域&#xff0c;利用内部潜在的攻击面——例如Wi-Fi网络、RFID门禁、暴露的有线网口、USB接口等——获取关键信息&#xff0c;并以隐蔽的…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...