Android 中获取当前 CPU 频率和占用率

devtools/2024/10/15 19:36:56/

最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:

目前没有标准的 API 来获取 CPU 的使用频率,只能通过读取指定 CPU 文件获取当前 CPU 频率,在某些机器或者特定版本中,可能需要ROOT 权限或者特殊权限,因此会存在一定几率的失败,因此需要做好 Try…catch 动作。又因为现在手机 CPU 的多核数目,因此我们可能需要获取多个 CPU 频率数,并取平均值。

获取系统 CPU 核心数:

 val cpuCoreNum = Runtime.getRuntime().availableProcessors()

获取指定 CPU 当前频率:

/sys/devices/system/cpu/cpu${index}/cpufreq/scaling_cur_freq

那么核心代码为:

private fun getAllCpuCoreFrequency() : Long {var frequency = 0Lfor (index in 0 until  cpuCoreNum){frequency += readFile("/sys/devices/system/cpu/cpu$index/cpufreq/scaling_cur_freq")}BLog.d("frequency : $frequency")return frequency / cpuCoreNum}private fun readFile(filePath: String): Long{try {val file = RandomAccessFile(filePath, "r")val content = file.readLine()file.close()if (TextUtils.isEmpty(content)){return 0L}BLog.d("readFile content : $content")return content.trim().toLong()}catch (e : Exception){e.printStackTrace()return 0L}}

如果需要获取 CPU 的占用率,那么就需要知道每个核心的最大频率和最小频率,同样是通过文件获取:

//max frequency file
/sys/devices/system/cpu/cpu${index}/cpufreq/cpuinfo_max_freq//min frequency file
/sys/devices/system/cpu/cpu${index}/cpufreq/cpuinfo_min_freq

那么核心代码为:

object CPUUtils {private var cpuCoreNum = 0private var cpuMaxFrequency = 0Lprivate var cpuMinFrequency = 0Lfun initCpuCoreNum(){if (cpuCoreNum <= 0 || cpuMaxFrequency <= 0L || cpuMinFrequency <= 0L){cpuCoreNum = Runtime.getRuntime().availableProcessors()initMaxAndMinFrequency()if (cpuCoreNum > 0 && cpuMaxFrequency > 0L && cpuMinFrequency > 0L){SpManager.getInstance().setCanUseCPUFrequency(true)}}BLog.d("cpuCoreNum : $cpuCoreNum")}private fun initMaxAndMinFrequency()  {if (cpuCoreNum <= 0){return}cpuMaxFrequency = 0LcpuMinFrequency = 0Lfor (index in 0 until cpuCoreNum){cpuMaxFrequency += readFile("/sys/devices/system/cpu/cpu${index}/cpufreq/cpuinfo_max_freq")cpuMinFrequency += readFile("/sys/devices/system/cpu/cpu${index}/cpufreq/cpuinfo_min_freq")}BLog.d("cpuMaxFrequency : $cpuMaxFrequency, cpuMinFrequency : $cpuMinFrequency")}private fun readFile(filePath: String): Long{try {val file = RandomAccessFile(filePath, "r")val content = file.readLine()file.close()if (TextUtils.isEmpty(content)){return 0L}BLog.d("readFile content : $content")return content.trim().toLong()}catch (e : Exception){ExceptionHandler.recordException(e)return 0L}}private fun getAllCpuCoreFrequency() : Long {initCpuCoreNum()if (cpuCoreNum <=0){return 0L}var frequency = 0Lfor (index in 0 until  cpuCoreNum){frequency += readFile("/sys/devices/system/cpu/cpu$index/cpufreq/scaling_cur_freq")}BLog.d("frequency : $frequency")return frequency}fun findCurrentFrequencyPercent() : Long {val currentFrequency = getAllCpuCoreFrequency()BLog.d("currentFrequency : $currentFrequency, cpuMinFrequency : $cpuMinFrequency, cpuMaxFrequency : $cpuMaxFrequency")if (cpuMaxFrequency - cpuMinFrequency <= 0L || currentFrequency - cpuMinFrequency < 0L || cpuMaxFrequency - currentFrequency < 0L){return 0L}return (currentFrequency - cpuMinFrequency) * 100 / (cpuMaxFrequency - cpuMinFrequency)}fun getCpuCoreFrequency() : Long {initCpuCoreNum()if (cpuCoreNum <=0){return 0L}return getAllCpuCoreFrequency() / cpuCoreNum}}

获取 CPU 频率:

CPUUtils.getCpuCoreFrequency()

获取 CPU 占用率:

CPUtils.findCurrentFrequencyPercent()

http://www.ppmy.cn/devtools/126313.html

相关文章

理解C语言之深入理解指针(五)

目录 1. sizeof和strlen的对⽐ 1.1 sizeo 1.2 strlen 1.3 sizeof和strlen的对⽐ 2. 数组和指针笔试题解析 2.1 ⼀维数组 2.2 字符数组 2.3 ⼆维数组 3. 指针运算笔试题解析 3.1 题⽬1&#xff1a; 3.2 题⽬2 3.3 题⽬3 3.4 题⽬4 3.5 题⽬5 3.6 题⽬6 3.7 题⽬…

AD9680(adc直采芯片)使用说明

写这篇文章之前我是没有使用过AD9680的芯片&#xff0c;但是使用过GMS011芯片&#xff08;是国内24S&#xff09;下的公司出来的芯片&#xff0c;寄存器和管脚全对标。 在这里我就大概说一下芯片的说用方法 一、硬件设计 该芯片支持双通道射频直采 支持协议JESD204B 14位 采样…

【模型】Self-Attention

Self-Attention 机制&#xff08;Self-Attention Mechanism&#xff09;是近年来深度学习中&#xff0c;特别是自然语言处理&#xff08;NLP&#xff09;任务中广泛应用的一种机制&#xff0c;它最初出现在Transformer架构中&#xff0c;用于捕捉序列数据中的依赖关系。该机制的…

2012年国赛高教杯数学建模A题葡萄酒的评价解题全过程文档及程序

2012年国赛高教杯数学建模 A题 葡萄酒的评价 确定葡萄酒质量时一般是通过聘请一批有资质的评酒员进行品评。每个评酒员在对葡萄酒进行品尝后对其分类指标打分&#xff0c;然后求和得到其总分&#xff0c;从而确定葡萄酒的质量。酿酒葡萄的好坏与所酿葡萄酒的质量有直接的关系&…

自动驾驶高频面试题及答案

目录 高频面试题及答案1. 什么是自动驾驶?2. 自动驾驶的主要传感器有哪些?3. 自动驾驶中的感知与决策有什么区别?4. 解释一下自动驾驶的等级划分。5. 如何处理自动驾驶中的安全性问题?6. 自动驾驶车辆如何实现环境感知?7. 在自动驾驶中,如何处理车辆之间的通信?8. 自动驾…

【内网映射】frps实现内网映射

1. 简介 在当今互联网时代,远程访问内网资源已成为一种常见需求。无论是在家访问办公室的电脑,还是远程管理家庭NAS,内网映射都是一种强大的解决方案。 本文将详细介绍如何使用frp(Fast Reverse Proxy)来实现这一目标。 1.1 frp frp是一个高性能的反向代理应用,可以帮助您轻…

Python爬虫高效数据爬取方法

大家好!今天我们来聊聊Python爬虫中那些既简洁又高效的数据爬取方法。作为一名爬虫工程师,我们总是希望用最少的代码完成最多的工作。下面我ll分享一些在使用requests库进行网络爬虫时常用且高效的函数和方法。 1. requests.get() - 简单而强大 requests.get()是我们最常用的…

矩阵相关算法

矩阵旋转90度 给定一个 n n 的二维矩阵 matrix 表示一个图像&#xff0c;请你将图像顺时针旋转 90 度。 #include <iostream> #include <vector>using namespace std;void rotate(vector<vector<int>>& matrix) {int n matrix.size();// 第一步…