You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过编程获取Android设备的全量热信息(含CPU全核心、GPU等多维度温度数据)

在Android中编程提取热传感器温度数据

嘿,我来帮你搞定这个温度提取的问题!从你给出的vbal_lowgold-virt-max-step这类节点名称来看,这些都是Android系统通过sysfs暴露的热传感器节点数据,大部分都集中在/sys/class/thermal/路径下。下面是具体的实现思路和代码示例:

核心原理

Android的热管理系统会把每个热传感器对应到/sys/class/thermal/thermal_zoneX/目录(X是数字序号,比如0、1、2...),每个目录里有两个关键文件:

  • type:存储传感器的名称(就是你提到的那些标识,比如cpu3-silver-lowf
  • temp:存储温度值,单位是毫摄氏度(mC),比如37900就对应37.9℃

实现步骤

1. 遍历热传感器目录

首先需要遍历/sys/class/thermal/下所有以thermal_zone开头的文件夹,每个文件夹对应一个热传感器。

2. 读取传感器名称和温度

对每个热传感器目录,分别读取typetemp文件的内容,转换为对应的名称和摄氏度数值。

3. 异常处理与兼容性

不同厂商的定制系统可能会有路径差异,部分节点可能无法读取,需要做好异常捕获。

代码示例(Kotlin)

fun getAllThermalTemperatures(): Map<String, Double> {
    val thermalDirs = listOf(
        File("/sys/class/thermal/"),
        File("/sys/devices/virtual/thermal/") // 兼容部分定制系统的路径
    )
    val tempMap = mutableMapOf<String, Double>()

    thermalDirs.forEach { baseDir ->
        baseDir.listFiles()?.forEach { zoneDir ->
            if (zoneDir.isDirectory && zoneDir.name.startsWith("thermal_zone")) {
                // 读取传感器名称
                val typeFile = File(zoneDir, "type")
                if (!typeFile.exists()) return@forEach
                val sensorName = typeFile.readText().trim()

                // 读取并转换温度值
                val tempFile = File(zoneDir, "temp")
                if (!tempFile.exists()) return@forEach
                try {
                    val tempMilliCelsius = tempFile.readText().trim().toInt()
                    val tempCelsius = tempMilliCelsius / 1000.0
                    tempMap[sensorName] = tempCelsius
                } catch (e: Exception) {
                    // 处理读取失败:比如无权限、数值格式错误
                    e.printStackTrace()
                }
            }
        }
    }
    return tempMap
}

代码示例(Java)

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class ThermalReader {
    public static Map<String, Double> getAllThermalTemperatures() {
        File[] baseDirs = {
                new File("/sys/class/thermal/"),
                new File("/sys/devices/virtual/thermal/")
        };
        Map<String, Double> tempMap = new HashMap<>();

        for (File baseDir : baseDirs) {
            File[] zoneDirs = baseDir.listFiles();
            if (zoneDirs == null) continue;

            for (File zoneDir : zoneDirs) {
                if (!zoneDir.isDirectory() || !zoneDir.getName().startsWith("thermal_zone")) {
                    continue;
                }

                // 读取传感器名称
                File typeFile = new File(zoneDir, "type");
                if (!typeFile.exists()) continue;
                String sensorName = "";
                try (BufferedReader reader = new BufferedReader(new FileReader(typeFile))) {
                    sensorName = reader.readLine().trim();
                } catch (IOException e) {
                    e.printStackTrace();
                    continue;
                }

                // 读取并转换温度
                File tempFile = new File(zoneDir, "temp");
                if (!tempFile.exists()) continue;
                try (BufferedReader reader = new BufferedReader(new FileReader(tempFile))) {
                    String tempStr = reader.readLine().trim();
                    int tempMilliCelsius = Integer.parseInt(tempStr);
                    double tempCelsius = tempMilliCelsius / 1000.0;
                    tempMap.put(sensorName, tempCelsius);
                } catch (IOException | NumberFormatException e) {
                    e.printStackTrace();
                }
            }
        }
        return tempMap;
    }
}

注意事项

  • 单位转换:一定要记得把temp文件里的数值除以1000,因为存储的是毫摄氏度,否则会得到37900这种错误的数值。
  • 路径兼容性:部分定制ROM可能把热节点放在/sys/devices/virtual/thermal/,所以代码里同时遍历了两个路径。
  • 性能优化:如果需要频繁读取温度,建议缓存结果,比如每隔1-2秒读取一次,避免频繁IO操作消耗资源。
  • 权限问题:大部分系统中访问sysfs不需要额外权限,但极少数定制系统可能会限制,此时需要申请READ_EXTERNAL_STORAGE或者系统签名(不过这种情况很少见)。

内容的提问来源于stack exchange,提问作者koshur

火山引擎 最新活动