如何在Android中获取CPU温度

13

传感器类型 TYPE_TEMPERATURE 已被弃用[自 Android 2.3 开始],可能是因为它提供了有关 CPU 温度的信息。 现在我们有传感器类型 TYPE_AMBIENT_TEMPERATURE,它将为我们提供房间温度(对我来说没有用处,顺便说一下,并非所有设备/Android 版本都支持它)

我检查了几个测量 CPU 温度的应用程序。可能他们正在读取系统文件。我尝试定位,在某些设备上我能够在以下路径中找到它:

sys/devices/virtual/thermal/thermal_zone0/temp

结构位因供应商而异,单位也不同。没问题!但在许多设备上,我根本找不到这样的文件,在同一设备中那些应用程序却可以工作!我想知道,为什么!

我们如何在Android中测量CPU温度?


我使用 sys/devices/virtual/thermal/thermal_zone0/temp 比使用 Manuel 的 sys/class/hwmon/hwmonX/temp1_input 更成功。 - ban-geoengineering
这是迄今为止CPU温度路径的最全列表:https://dev59.com/DWIi5IYBdhLWcg3w9wYU#59306562 - Cornelius Roemer
4个回答

5

我使用了以下路径:

sys/class/hwmon/hwmonX/temp1_input

适用于大多数手机的技术


对于华为荣耀4C而言,不是:“没有这样的文件或目录”。 - t0m
这在三星 Galaxy Core Prime 上不起作用,但是 OP 的 sys/devices/virtual/thermal/thermal_zone0/temp 起了作用。 :-) - ban-geoengineering
在大多数手机上,如果真的查看hwmon文件夹内部,您会发现CPU温度。但是如何知道哪个hwmonX才是您的CPU呢? - Kamen Stoykov

2

过时并不等于已删除!如果您发现设备仍然提供过时的传感器类型,则可以继续使用它。

废弃旧传感器名称的部分原因是,当看到温度传感器时,公众期望的是温度为环境空气温度。但是,在许多情况下,传感器是CPU的一部分/非常靠近CPU,因此它实际上大多反映了CPU温度。

通过添加一个新的(可选的)传感器类型,即明确的空气温度,可以更好地管理这种期望:

  • 如果您想要测量空气温度,则使用新的传感器(如果有)
  • 如果您不关心所测量的内容(但在大多数实际情况下会得到受CPU温度影响较大的结果),则使用过时的传感器(如果有)

1
我同意你的答案,如果可用,可以使用已弃用的传感器来获取CPU温度。但是大多数设备不支持它,在同一设备中,可以使用CPU温度测量应用程序显示CPU温度而不是环境温度[正确行为]。正如我在问题中提到的那样,我也找到了方法,但似乎不完全可靠。即跟踪因供应商而异的系统文件。 - jQueen

1

如果您的应用程序是集成在设备操作系统中的系统应用程序,则可以直接使用HardwarePropertiesManager

如果不是,以下是一些sysfs路径列表,您可以读取以获取温度:

/sys/devices/system/cpu/cpu0/cpufreq/cpu_temp
/sys/devices/system/cpu/cpu0/cpufreq/FakeShmoo_cpu_temp
/sys/class/thermal/thermal_zone0/temp
/sys/class/i2c-adapter/i2c-4/4-004c/temperature
/sys/devices/platform/tegra-i2c.3/i2c-4/4-004c/temperature
/sys/devices/platform/omap/omap_temp_sensor.0/temperature
/sys/devices/platform/tegra_tmon/temp1_input
/sys/kernel/debug/tegra_thermal/temp_tj
/sys/devices/platform/s5p-tmu/temperature
/sys/class/thermal/thermal_zone1/temp
/sys/class/hwmon/hwmon0/device/temp1_input
/sys/devices/virtual/thermal/thermal_zone1/temp
/sys/devices/virtual/thermal/thermal_zone0/temp
/sys/class/thermal/thermal_zone3/temp
/sys/class/thermal/thermal_zone4/temp
/sys/class/hwmon/hwmonX/temp1_input
/sys/devices/platform/s5p-tmu/curr_temp

您可以在这里了解更多有关如何读取系统文件的信息。


1

这里是Xamarin.Android的示例 - 它非常简单,只需要循环遍历预定义文件路径列表(我有23个),并从第一个打开时不失败的文件中读取一行(然后将字符串转换为数字,缩放为度数)。

在以下设备上进行了验证:

  • 三星 Galaxy Note 10 (Snapdragon) API 29
  • 三星 Galaxy A5 2017 API 级别 24
  • 三星 Galaxy A9 2018,API 级别 26
  • Essential Phone API 级别 26
  • 小米 MI 6 API 级别 28
  • 小米 MI 8 Pro,API 级别 28
  • 华为 Mate 9,API 级别 24
  • 华为 Mate RS,API 级别 28
  • Nokia N1(Intel Atom)API 21
  • 华为 Honor Play,API 级别 27
  • Galaxy Note 3 Duos,API 级别 19
  • Xperia XZ2,API 级别 28
  • Motorola One XT1941-4,API 级别 28
  • 联想 S5,API 26

无法使用:

  • Xiaomi Mi 8SE API 27(在/sys/devices/virtual/thermal/thermal_zone9/temp找到一个CPU核心的温度)
  • Xiaomi Mi 5s API 26
  • 搭载Exynos CPU的Galaxy S设备
    • Samsung Galaxy S10 SM-G973F (Exynos), API Level 28
    • Samsung Galaxy S9+ SM-G965F (Exynos) API 28
    • Samsung Galaxy S8+ SM-G955N (Exynos) API 26
  • Nokia 1 (Android GO), API Level 27

背景

  1. 标准传感器API无法提供CPU温度信息
  2. HardwarePropertiesManager API仅适用于Android企业版,不是典型用例
  3. 获取CPU温度的唯一方法是具有系统文件的“神奇”路径列表,可报告温度读数
像CPU-Z这样的程序拥有内部路径列表,可以探测包含传感器/读数名称(通常命名为“type”或“name”)和实际值(通常命名为“temp”)的文件。例如,在/sys/devices/virtual/thermal/thermal_zone0下,一个人可以从type文件中读取“cpu-0-0-user”值,从temp文件中读取“32100”值。
在单个设备上有多个具有不同传感器名称的文件。通过传感器的名称,一个人可以猜测它是否与CPU相关(名称中包含CPU或SoC或其他内容)。确切地说,并不存在单一的“CPU温度”值,有许多不同的值。如果您不关心细节(例如区分核心或封装温度),选择一个值应该代表CPU的热情况。
此外,传感器名称(以及文件路径)对于各种设备供应商来说也是不同的。传感器值可以是整数或不到千位数。温度读数可以实现的多样性促使为CPU温度没有标准API在Android中。
我收集的列表不完整(似乎比CPU-Z内部的列表小),尽管我花了很多时间搜索。

如何为特定设备找到正确的路径

  • 获取设备
  • 安装Termux并执行cdlscat命令,浏览各种路径(从上面示例中的列表开始),调查内部情况并搜索所需的传感器

有没有办法让它在三星S-8-9-10+设备上运行? - MasterMind
假设您指的是Exynis变体(因为示例中的Samplebabive与Snapdragon兼容)...获取设备 安装Termux并进行cd,ls和cat,浏览各种路径(从上面的示例列表开始),调查内部情况并搜索所需的传感器。 - Maxim Saplin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接