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_activate
和 power: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的方法:
-
通过USB连接手机到电脑
-
adb shell,然后执行如下命令:
sleep 10 && /data/powertop [-r] -d -t 30 > /data/powertop.log &
-
拔掉USB线,等待10秒后开始功耗测试
-
插上USB
-
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框架 中监听组件内部字体大小并调整宽度,可以结合 自定义事件 或 数据绑定 来实现动态调整。San 框架没有直接的监听 DOM 尺寸变化的内置方法,但可以通过以下步骤实现: 方法一:使用 ResizeObserver 监听字体变化 在组件的 …...
如何选择服务器
如何选择服务器 选择服务器时应考虑以下几个关键因素: 性能需求。根据网站的预期流量和负载情况,选择合适的处理器、内存和存储容量。考虑网站是否需要处理大量动态内容或高分辨率媒体文件。 可扩展性。选择一个可以轻松扩展的服务器架构,以便…...
嵌入式驱动面试总结
操作系统: 中断的处理流程,中断处理需要注意些什么 软中断和硬中断区别 linux驱动用过那些锁,信号量,互斥锁 自旋锁和互斥锁的区别 二值信号量和互斥信号量有什么区别 进程锁怎么实现的,说一下流程; …...
Uniapp 简单配置鸿蒙
Uniapp 简单配置鸿蒙 前言下载并配置鸿蒙IDEHbuilder X 配置基本的信息生成相关证书登录官网获取证书IDE配置证书添加调试设备可能出现的问题前言 如今鸿蒙的盛起,作为多端开发的代表也是开始兼容鸿蒙应用的开发,接下来我将介绍如何在uniapp中配置鸿蒙。 注意:hbuilder X的…...
线程池的实现与应用
一、线程池 一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,…...
基于Java Springboot单位考勤系统
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…...
近源渗透|HID ATTACK从0到1
前言 对于“近源渗透”这一术语,相信大家已经不再感到陌生。它涉及通过伪装、社会工程学等手段,实地侵入企业办公区域,利用内部潜在的攻击面——例如Wi-Fi网络、RFID门禁、暴露的有线网口、USB接口等——获取关键信息,并以隐蔽的…...
【linux】插入新硬盘如何配置:格式化、分区、自动挂载(Ubuntu)
文章目录 具体方法GPT分区表(GUID Partition Table)(建议都用这种分区方法)MBR分区表方法(最大支持2TB分区)(Master Boot Record) 附加:如何查看硬盘的型号另外ÿ…...
YOLOv8-ultralytics-8.2.103部分代码阅读笔记-block.py
block.py ultralytics\nn\modules\block.py 目录 block.py 1.所需的库和模块 2.class DFL(nn.Module): 3.class Proto(nn.Module): 4.class HGStem(nn.Module): 5.class HGBlock(nn.Module): 6.class SPP(nn.Module): 7.class SPPF(nn.Module): 8.class C1(nn.M…...
代码随想录算法训练营第五十三天|Day53 图论
字符串接龙 https://www.programmercarl.com/kamacoder/0110.%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%8E%A5%E9%BE%99.html 思路 #include <stdio.h> #include <stdlib.h> #include <string.h>#define MAX 1000 // 假设最大字符串数 #define WORD_LENGTH 100 // 假…...
LeetCode:203.移除链表元素
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:203.移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.…...
知识见闻 - 数学: 均方根 Root Mean Square
What is Root Mean Square (RMS)? 在统计学上,均方根(RMS)是均方的平方根,而均方是一组数值的平方的算术平均数。均方根也称为二次均值,是指数为 2 的广义均值的一种特例。均方根也被定义为基于一个周期内瞬时值的平方…...
机器硬件调优
grub参数 ipv6.disable1 ipv6.autoconf0 intel_pstatedisable nohzoff idlepoll intel_idle.max_cstate0 processor.max_cstate0 mceignore_ce nmi_watchdog0 transparent_hugepagenever pcie_aspm.policyperformance audit0 irqaffinity0 nosoftlockup grub2-mkconfig -o /bo…...
如何更改手机GPS定位
你是否曾想过更改手机GPS位置以保护隐私、玩游戏或访问受地理限制的内容?接下来我将向你展示如何使用 MagFone Location Changer 更改手机GPS 位置!无论是在玩Pokmon GO游戏、发布社媒贴子,这种方法都快速、简单且有效。 第一步:下…...
HarmonyOS(57) UI性能优化
性能优化是APP开发绕不过的话题,那么在HarmonyOS开发过程中怎么进行性能优化呢?今天就来总结下相关知识点。 UI性能优化 1、避免在组件的生命周期内执行高耗时操作2、合理使用ResourceManager3、优先使用Builder方法代替自定义组件4、参考资料 1、避免在…...
Mysql的加锁情况详解
最近在复习mysql的知识点,像索引、优化、主从复制这些很容易就激活了脑海里尘封的知识,但是在mysql锁的这一块真的是忘的一干二净,一点映像都没有,感觉也有点太难理解了,但是还是想把这块给啃下来,于是想通…...
hive3.1.2编译spark3安装包
此安装包是《去破解站长》在公司真实生产环境所使用的安装包。 引言:Hive引擎包括:默认MR、tez、sparkDownload:www.qupojie.com 1、Hive on Spark 1、Hive onSpark:Hive既作为存储元数据又负责SQL的解析优化,语法是HQL语法&…...
网站建设968/网络怎么推广自己的产品
作用:在日志中设置一些个性化的标记,方便后期做处理 tags 和 fields 添加其中一个,或都添加,都可以,自己确定1 新建配置文件 a_4.yml # 输入 filebeat.inputs: - type: logenabled: truepaths:- /data/logs/*.log# Be…...
阿里云 wordpress cdn/seo的工作内容主要包括
今天为了将mxnet框架转为tensorflow 框架,参考了下面帖子来操作一下 pip install mmdnn 装好后,页面有提示,就先忽略掉了 mxnet-cu100 1.4.1 has requirement numpy<1.15.0,>1.8.2, but youll have numpy 1.16.4 which is incompatible. mxnet-cu90 1.4.1 has require…...
粘贴以下代码到网站首页代码的与标签之间/营销课程
数据库是组成Web项目最重要的部分之一,所以数据中执行的sql语句的效率会影响整个项目的性能,为了提高sql语句的执行效率就需要对sql语句进行相关的优化,MySQL数据库因为其开源免费的特点是目前使用最广泛的数据库之一,下面对mysql…...
不备案的网站能打开吗/好用搜索引擎排名
主要参考文档: 中文:http://wiki.centos.org/zh/HowTos/VNC-Server 英文:http://wiki.centos.org/HowTos/VNC-Server 描述很规范、全面。 记录下安装过程中知识点/要点: 1.linux是一个内核,需安装一个窗口管理员来取得…...
wordpress怎么设置404页面/游戏推广怎么快速拉人
先附上一张大神画的模型结构图,按着模型的结构进行学习。 一、input端 1、Mosaic数据增强: (1)思想:采用与Yolov4一样的Mosaic数据增强,参考了2019年底提出的CutMix数据增强的方式,但CutMix只…...
代做课题网站/长春网站制作设计
前言:Java的类库日益庞大,所包含的类和接口也不计其数。但其中有一些非常重要的类和接口,是Java类库中的核心部分。常见的有String、Object、Class、Collection、ClassLoader...,熟悉这些类是学好Java的基础。而这些类一般不容易理…...