安卓各部分的温度,以获得探索的逻辑
Android各种部件温度获取逻辑探究
Preface
事件的来源是做一个性能监测工具获取GPU,电池温度数据时反了snapdragon的pluginGPU-GGPM
的so,这个so对应会获取GPU General
的GPU theramal
也就是GP温度数据。snapdragon会把获取温度的文件名通过logcat打出来,如下:
sub_94FE0(v69, 1LL, "GGPMProvider", "GGPM_DP: Reading GPU Temperature from '/sys/class/kgsl/kgsl-3d0/temp'");
可以在snapdrgon连接上手机后从logcat日志出看出这一句:
grus:/ $ logcat | grep Temperature
11-23 11:01:53.264 17088 17088 I SDP : SDPCore.Metric: Metric 'GPU Temperature' activated for all processes
11-23 11:10:12.597 23936 23936 I SDP : GGPMProvider: GGPM_DP: Reading GPU Temperature from '/sys/devices/virtual/thermal/thermal_zone29/temp'
也就是说snapdrgon是从/sys/devices/virtual/thermal/thermal_zone29/temp
这个文件中拿出的GPU温度数据。
在这之前,我获取CPU温度数据的逻辑也是从一些文件中读取数据,比如:
"/sys/class/thermal/thermal_zone7/temp",
"/sys/devices/virtual/thermal/thermal_zone7/temp",
// "/sys/kernel/debug/tegra_thermal/temp_tj",
// "/sys/devices/platform/s5p-tmu/curr_temp",
// "/sys/devices/virtual/thermal/thermal_zone1/temp",//常用
// "/sys/devices/system/cpu/cpufreq/cput_attributes/cur_temp",
// "/sys/devices/virtual/hwmon/hwmon2/temp1_input",
// "/sys/devices/platform/coretemp.0/temp2_input",
// "/sys/devices/virtual/thermal/thermal_zone0/temp",
// "/sys/devices/system/cpu/cpu0/cpufreq/cpu_temp",
// "/sys/devices/platform/omap/omap_temp_sensor.0/temperature",
// "/sys/class/thermal/thermal_zone1/temp",
// "/sys/devices/platform/s5p-tmu/temperature",
// "/sys/devices/w1 bus master/w1_master_attempts",
// "/sys/class/thermal/thermal_zone0/temp"
"/sys/devices/virtual/thermal/thermal_zone0/temp",
"/sys/class/thermal/thermal_zone0/temp",
"/sys/kernel/debug/tegra_thermal/temp_tj",
"/sys/devices/platform/s5p-tmu/curr_temp",
"/sys/devices/virtual/thermal/thermal_zone1/temp",
"/sys/devices/system/cpu/cpufreq/cput_attributes/cur_temp",
"/sys/devices/virtual/hwmon/hwmon2/temp1_input",
"/sys/devices/platform/coretemp.0/temp2_input",
"/sys/devices/platform/omap/omap_temp_sensor.0/temperature",
"/sys/class/thermal/thermal_zone1/temp",
"/sys/devices/platform/s5p-tmu/temperature",
"/sys/devices/w1 bus master/w1_master_attempts",
"/sys/devices/system/cpu/cpu0/cpufreq/cpu_temp",
"/sys/devices/system/cpu/cpu0/cpufreq/FakeShmoo_cpu_temp",
"/sys/class/i2c-adapter/i2c-4/4-004c/temperature",
"/sys/devices/platform/tegra-i2c.3/i2c-4/4-004c/temperature",
"/sys/devices/platform/tegra_tmon/temp1_input",
"/sys/class/hwmon/hwmon0/device/temp1_input",
"/sys/devices/virtual/thermal/thermal_zone1/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"
可以看到,获取CPU温度中主要使用了/sys/devices/virtual/thermal/thermal_zone7/temp
。现在的问题是,这些thermal_zone到底有什么作用? 如何使用分辨不同的thermal_zone的作用?
Manuscript
为了解决上述的问题,有了下面的探究。
不同的厂家和设备之间可能存在着明显的兼容性问题,因此此处表明本次测试环境是XIAO MI9 SE, MIUI 12.0.3, Android 10。
深究thermal_zone
比如gpu-virt-max-step
的thermal_zone,这个概念其实在安卓内核源码中: qti_virtual_sensor.c:
static const struct virtual_sensor_data qti_virtual_sensors[] = {
{
.virt_zone_name = "gpu-virt-max-step",
.num_sensors = 2,
.sensor_names = {"gpu0-usr",
"gpu1-usr"},
.logic = VIRT_MAXIMUM,
},
....
};
在这个结构中,virt_zone_name
也就是thermal_zone的type,而sensor_names
决定了数据的来源,在这里也就是数据来源是名为gpu0-usr
和gpu1-usr
的两个温度传感器。
具体有多少个传感器,分别有什么作用,取决于SOC厂商,不过SOC厂商会将这些信息写入到安卓源码中。
高通SOC传感器
在安卓源码中,platform/hardware/qcom/ 下面列出了高通一些soc的硬件信息。
比如thermal_target.c就列出了在android13下sdm845处理器的一些传感器信息。
- qcom android9: android.googlesource.com/platform/ha…
- qcom android10: android.googlesource.com/platform/ha…
- qcom android11: android.googlesource.com/platform/ha…
- qcom android12: android.googlesource.com/platform/ha…
- qcom android13: android.googlesource.com/platform/ha…
- qcom adnroid14: android.googlesource.com/platform/ha…
CPU温度传感器
从thermal_target.c
文件中可以提取出用于衡量CPU温度传感器例如有:
static char *cpu_sensors_talos[] =
{
"cpuss-2-usr",
"cpuss-2-usr",
"cpuss-1-usr",
"cpuss-1-usr",
"cpuss-0-usr",
"cpuss-0-usr",
"cpu-1-0-usr",
"cpu-1-2-usr",
};
static char *cpu_sensors_sdmmagpie[] =
{
"cpu-0-0-usr",
"cpu-0-1-usr",
"cpu-0-2-usr",
"cpu-0-3-usr",
"cpu-0-4-usr",
"cpu-0-5-usr",
"cpu-1-0-usr",
"cpu-1-2-usr",
};
static char *cpu_sensors_trinket[] =
{
"cpuss-0-usr",
"cpuss-0-usr",
"cpuss-0-usr",
"cpuss-0-usr",
"cpu-1-0-usr",
"cpu-1-1-usr",
"cpu-1-2-usr",
"cpu-1-3-usr",
};
static char *cpu_sensors_bengal[] =
{
"cpuss-2-usr",
"cpuss-2-usr",
"cpuss-2-usr",
"cpuss-2-usr",
"cpu-1-0-usr",
"cpu-1-1-usr",
"cpu-1-2-usr",
"cpu-1-3-usr",
};
static char *cpu_sensors_msmnile[] =
{
"cpu-0-0-usr",
"cpu-0-1-usr",
"cpu-0-2-usr",
"cpu-0-3-usr",
"cpu-1-0-usr",
"cpu-1-1-usr",
"cpu-1-2-usr",
"cpu-1-3-usr",
};
static char *cpu_sensors_660[] =
{
"tsens_tz_sensor1",
"tsens_tz_sensor1",
"tsens_tz_sensor1",
"tsens_tz_sensor1",
"tsens_tz_sensor3",
"tsens_tz_sensor4",
"tsens_tz_sensor5",
"tsens_tz_sensor6",
};
static char *cpu_sensors_630[] =
{
"tsens_tz_sensor3",
"tsens_tz_sensor4",
"tsens_tz_sensor5",
"tsens_tz_sensor6",
"tsens_tz_sensor7",
"tsens_tz_sensor7",
"tsens_tz_sensor7",
"tsens_tz_sensor7",
};
static char *cpu_sensors_8953[] =
{
"tsens_tz_sensor9",
"tsens_tz_sensor10",
"tsens_tz_sensor11",
"tsens_tz_sensor12",
"tsens_tz_sensor4",
"tsens_tz_sensor5",
"tsens_tz_sensor6",
"tsens_tz_sensor7",
};
static char *cpu_sensors_710[] =
{
"cpu0-silver-usr",
"cpu1-silver-usr",
"cpu2-silver-usr",
"cpu3-silver-usr",
"cpu4-silver-usr",
"cpu5-silver-usr",
"cpu0-gold-usr",
"cpu1-gold-usr",
};
static char *cpu_sensors_632[] =
{
"cpuss0-usr",
"cpuss0-usr",
"cpuss0-usr",
"cpuss0-usr",
"apc1-cpu0-usr",
"apc1-cpu1-usr",
"apc1-cpu2-usr",
"apc1-cpu3-usr",
};
static char *cpu_sensors_439[] =
{
"apc1-cpu0-usr",
"apc1-cpu1-usr",
"apc1-cpu2-usr",
"apc1-cpu3-usr",
"cpuss0-usr",
"cpuss0-usr",
"cpuss0-usr",
"cpuss0-usr",
};
static char *cpu_sensors_8917[] =
{
"apc1-cpu0-usr",
"apc1-cpu1-usr",
"apc1-cpu2-usr",
"apc1-cpu3-usr",
};
// 这个在源码中没看到,但在8gen系列机器的thermal_zone中看到了所以加上
"cpu_therm"
GPU温度传感器
从thermal_target.c
文件中可以提取出用于衡量GPU温度传感器例如有:
"gpu-usr",
"gpu0-usr",
"gpuss-0-usr",
"tsens_tz_sensor8",
"tsens_tz_sensor9",
"tsens_tz_sensor15",
// 这个在源码中没看到,但在8gen系列机器的thermal_zone中看到了所以加上
"gpuss-0",
Battery温度传感器
从thermal_target.c
文件中可以提取出用于衡量GPU温度传感器例如有:
"battery",
// TODO: pm660l_tz 和 battery的逻辑不是很清楚, 不过pm代表的是power management, 也就是Power Control IC。
联发科SOC传感器
在android源码中,关于早期联发科的一些温度传感器和monitor的信息在: mtk_thermal_monitor.c文件中。
static int mtk_thermal_get_tz_idx(char *type)
{
if (0 == strncmp(type, "mtktscpu", 8)) // CPU thermal
return MTK_THERMAL_SENSOR_CPU;
else if (0 == strncmp(type, "mtktsabb", 8))
return MTK_THERMAL_SENSOR_ABB;
else if (0 == strncmp(type, "mtktspmic", 9))
return MTK_THERMAL_SENSOR_PMIC;
else if (0 == strncmp(type, "mtktsbattery2", 13))
return MTK_THERMAL_SENSOR_BATTERY2;
else if (0 == strncmp(type, "mtktsbattery", 12))
return MTK_THERMAL_SENSOR_BATTERY; // battery
else if (0 == strncmp(type, "mtktspa", 7))
return MTK_THERMAL_SENSOR_MD1;
else if (0 == strncmp(type, "mtktstdpa", 9))
return MTK_THERMAL_SENSOR_MD2;
else if (0 == strncmp(type, "mtktswmt", 8))
return MTK_THERMAL_SENSOR_WIFI;
else if (0 == strncmp(type, "mtktsbuck", 9))
return MTK_THERMAL_SENSOR_BUCK;
else if (0 == strncmp(type, "mtktsAP", 7))
return MTK_THERMAL_SENSOR_AP;
else if (0 == strncmp(type, "mtktspcb1", 9))
return MTK_THERMAL_SENSOR_PCB1;
else if (0 == strncmp(type, "mtktspcb2", 9))
return MTK_THERMAL_SENSOR_PCB2;
else if (0 == strncmp(type, "mtktsskin", 9))
return MTK_THERMAL_SENSOR_SKIN;
else if (0 == strncmp(type, "mtktsxtal", 9))
return MTK_THERMAL_SENSOR_XTAL;
return -1;
}
海思麒麟SOC
只有远古时期的一份配置文件大概写了部分的传感器作用: android.googlesource.com/device/huaw…
...
[SS-CPU1]
#algo_type ss
sampling 10
sensor cpu1
device cluster0
set_point 85000
set_point_clr 55000
time_constant 0
[SS-CPU0]
#algo_type ss
sampling 10
sensor cpu0
device cluster0
set_point 85000
set_point_clr 55000
time_constant 0
...
例如cluster0
被用于代表CPU的温度,gpu
代表GPU的温度,Battery
用于电池温度。
总结
获取GPU, CPU以及battery等温度数据可以通过读取对应thermal_zone文件下的temp文件来获得,但是需要注意,由于不同手机厂商的方案不同,这些文件的type以及文件权限并不一定相同。目前看到的情况如下:
小米手机:
可以正常读取 /sys/class/thermal/ 路径下的文件夹和文件。
例如小米9 SE:
grus:/ $ cat /sys/class/thermal/thermal_zone44/type
battery
grus:/ $ cat /sys/class/thermal/thermal_zone29/type
gpu-virt-max-step
华为手机:
/sys/class/thermal/ 路径下的文件夹和文件权限不够;
可以通过读取 /sys/devices/virtual/thermal/ 路径下的文件夹和文件获取数据。
例如华为p30:
HWELE:/ $ cat /sys/devices/virtual/thermal/thermal_zone3/type
Battery
HWELE:/ $ cat /sys/devices/virtual/thermal/thermal_zone9/type
gpu
IQOO手机:
可以正常读取 /sys/class/thermal/ 路径下的文件夹和文件。
例如IQOO Z3:
PD2073:/ $ cat /sys/class/thermal/thermal_zone90/type
battery
PD2073:/ $ cat /sys/class/thermal/thermal_zone45/type
gpuss-max-step
OPPO手机:
可以正常读取 /sys/class/thermal/ 路径下的文件夹和文件。
例如OPPO Reno:
OP46B1:/ $ cat /sys/class/thermal/thermal_zone44/type
battery
OP46B1:/ $ cat /sys/class/thermal/thermal_zone33/type
gpu-virt-max-step
当然,也可以通过dumpsys来拿取温度信息例如:
fuxi:/ $ dumpsys battery
Current Battery Service state:
AC powered: false
USB powered: true
Wireless powered: false
Dock powered: false
Max charging current: 500000
Max charging voltage: 5000000
Charge counter: 3918
status: 2
health: 2
present: true
level: 94
scale: 100
voltage: 4370
temperature: 300
technology: Li-poly
最简单的方法无过于:
fuxi:/ $ dumpsys hardware_properties
****** Dump of HardwarePropertiesManagerService ******
CPU temperatures: [31.4, 31.8, 31.4, 31.4, 32.7, 31.9, 31.4, 31.9]
CPU throttling temperatures: [95.0, 95.0, 95.0, 95.0, 95.0, 95.0, 95.0, 95.0]
CPU shutdown temperatures: [115.0, 115.0, 115.0, 115.0, 115.0, 115.0, 115.0, 115.0]
CPU vr throttling temperatures: [95.0, 95.0, 95.0, 95.0, 95.0, 95.0, 95.0, 95.0]
GPU temperatures: [30.7, 30.7, 30.7, 31.5, 31.1, 30.7, 30.3, 30.7]
GPU throttling temperatures: [95.0, 95.0, 95.0, 95.0, 95.0, 95.0, 95.0, 95.0]
GPU shutdown temperatures: [115.0, 115.0, 115.0, 115.0, 115.0, 115.0, 115.0, 115.0]
GPU vr throttling temperatures: [95.0, 95.0, 95.0, 95.0, 95.0, 95.0, 95.0, 95.0]
Battery temperatures: [29.1]
Battery throttling temperatures: [80.0]
Battery shutdown temperatures: [90.0]
Battery vr throttling temperatures: [80.0]
Skin temperatures: [30.459]
Skin throttling temperatures: [46.5]
Skin shutdown temperatures: [95.0]
Skin vr throttling temperatures: [46.5]
Fan speed: []
Cpu usage of core: 0, active = 984100, total = 3727757
Cpu usage of core: 1, active = 791709, total = 3873520
Cpu usage of core: 2, active = 789328, total = 3865533
Cpu usage of core: 3, active = 564362, total = 4012228
Cpu usage of core: 4, active = 418064, total = 4043632
Cpu usage of core: 5, active = 311618, total = 4059520
Cpu usage of core: 6, active = 303790, total = 4059706
Cpu usage of core: 7, active = 203052, total = 4071083
****** End of HardwarePropertiesManagerService dump ******
也可以通过dumpsys thermalservice
拿取:
fuxi:/ $ dumpsys thermalservice
IsStatusOverride: false
ThermalEventListeners:
callbacks: 2
killed: false
broadcasts count: -1
ThermalStatusListeners:
callbacks: 5
killed: false
broadcasts count: -1
Thermal Status: 0
Cached temperatures:
Temperature{mValue=36.4, mType=2, mName=battery, mStatus=0}
Temperature{mValue=56.0, mType=0, mName=CPU0, mStatus=0}
Temperature{mValue=52.8, mType=0, mName=CPU1, mStatus=0}
Temperature{mValue=54.4, mType=0, mName=CPU2, mStatus=0}
Temperature{mValue=60.1, mType=0, mName=CPU3, mStatus=0}
Temperature{mValue=57.3, mType=0, mName=CPU4, mStatus=0}
Temperature{mValue=60.1, mType=0, mName=CPU5, mStatus=0}
Temperature{mValue=56.1, mType=0, mName=CPU6, mStatus=0}
Temperature{mValue=61.3, mType=0, mName=CPU7, mStatus=0}
Temperature{mValue=48.5, mType=1, mName=GPU0, mStatus=0}
Temperature{mValue=47.3, mType=1, mName=GPU1, mStatus=0}
Temperature{mValue=48.1, mType=1, mName=GPU2, mStatus=0}
Temperature{mValue=46.9, mType=1, mName=GPU3, mStatus=0}
Temperature{mValue=50.9, mType=1, mName=GPU4, mStatus=0}
Temperature{mValue=48.9, mType=1, mName=GPU5, mStatus=0}
Temperature{mValue=48.1, mType=1, mName=GPU6, mStatus=0}
Temperature{mValue=48.5, mType=1, mName=GPU7, mStatus=0}
Temperature{mValue=1.218, mType=7, mName=ibat, mStatus=0}
Temperature{mValue=48.5, mType=9, mName=nsp0, mStatus=0}
Temperature{mValue=48.1, mType=9, mName=nsp1, mStatus=0}
Temperature{mValue=46.5, mType=9, mName=nsp2, mStatus=0}
Temperature{mValue=46.5, mType=9, mName=nsp3, mStatus=0}
Temperature{mValue=42.039, mType=3, mName=skin, mStatus=0}
Temperature{mValue=0.0, mType=8, mName=socd, mStatus=0}
Temperature{mValue=4.185, mType=6, mName=vbat, mStatus=0}
HAL Ready: true
HAL connection:
ThermalHAL 2.0 connected: yes
Current temperatures from HAL:
Temperature{mValue=4.434, mType=6, mName=vbat, mStatus=0}
Temperature{mValue=28.9, mType=2, mName=battery, mStatus=0}
Temperature{mValue=-0.187, mType=7, mName=ibat, mStatus=0}
Temperature{mValue=30.7, mType=9, mName=nsp3, mStatus=0}
Temperature{mValue=30.7, mType=9, mName=nsp2, mStatus=0}
Temperature{mValue=31.1, mType=9, mName=nsp1, mStatus=0}
Temperature{mValue=30.3, mType=9, mName=nsp0, mStatus=0}
Temperature{mValue=30.23, mType=3, mName=skin, mStatus=0}
Temperature{mValue=30.7, mType=1, mName=GPU6, mStatus=0}
Temperature{mValue=30.3, mType=1, mName=GPU5, mStatus=0}
Temperature{mValue=30.7, mType=1, mName=GPU4, mStatus=0}
Temperature{mValue=31.0, mType=0, mName=CPU6, mStatus=0}
Temperature{mValue=31.1, mType=1, mName=GPU1, mStatus=0}
Temperature{mValue=30.3, mType=1, mName=GPU2, mStatus=0}
Temperature{mValue=30.7, mType=1, mName=GPU3, mStatus=0}
Temperature{mValue=31.8, mType=0, mName=CPU7, mStatus=0}
Temperature{mValue=30.7, mType=1, mName=GPU0, mStatus=0}
Temperature{mValue=31.0, mType=0, mName=CPU5, mStatus=0}
Temperature{mValue=0.0, mType=8, mName=socd, mStatus=0}
Temperature{mValue=31.0, mType=0, mName=CPU3, mStatus=0}
Temperature{mValue=31.9, mType=0, mName=CPU2, mStatus=0}
Temperature{mValue=31.5, mType=0, mName=CPU1, mStatus=0}
Temperature{mValue=31.8, mType=0, mName=CPU4, mStatus=0}
Temperature{mValue=30.7, mType=1, mName=GPU7, mStatus=0}
Temperature{mValue=31.1, mType=0, mName=CPU0, mStatus=0}
Current cooling devices from HAL:
CoolingDevice{mValue=0, mType=2, mName=thermal-pause-8}
CoolingDevice{mValue=0, mType=2, mName=cpufreq-cpu3}
CoolingDevice{mValue=0, mType=2, mName=thermal-pause-4}
CoolingDevice{mValue=2, mType=3, mName=gpu}
CoolingDevice{mValue=0, mType=2, mName=thermal-pause-2}
CoolingDevice{mValue=0, mType=2, mName=cpufreq-cpu7}
CoolingDevice{mValue=0, mType=2, mName=cpufreq-cpu0}
CoolingDevice{mValue=0, mType=2, mName=thermal-pause-40}
CoolingDevice{mValue=0, mType=2, mName=thermal-pause-10}
CoolingDevice{mValue=0, mType=2, mName=thermal-cluster-3-7}
CoolingDevice{mValue=0, mType=2, mName=thermal-pause-80}
CoolingDevice{mValue=0, mType=3, mName=devfreq-3d00000.qcom,kgsl-3d0}
CoolingDevice{mValue=0, mType=2, mName=thermal-pause-20}
Temperature static thresholds from HAL:
TemperatureThreshold{mType=6, mName=vbat, mHotThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN], mColdThrottlingThresholds=[NaN, NaN, NaN, 3.2, NaN, NaN, 3.0]}
TemperatureThreshold{mType=2, mName=battery, mHotThrottlingThresholds=[NaN, NaN, NaN, 80.0, NaN, NaN, 90.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=7, mName=ibat, mHotThrottlingThresholds=[NaN, NaN, NaN, 9.0, NaN, NaN, 10.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=9, mName=nsp3, mHotThrottlingThresholds=[NaN, NaN, NaN, 100.0, NaN, NaN, 115.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=9, mName=nsp2, mHotThrottlingThresholds=[NaN, NaN, NaN, 100.0, NaN, NaN, 115.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=9, mName=nsp1, mHotThrottlingThresholds=[NaN, NaN, NaN, 100.0, NaN, NaN, 115.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=9, mName=nsp0, mHotThrottlingThresholds=[NaN, NaN, NaN, 100.0, NaN, NaN, 115.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=3, mName=skin, mHotThrottlingThresholds=[NaN, NaN, NaN, 46.5, NaN, NaN, 95.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=1, mName=GPU6, mHotThrottlingThresholds=[NaN, NaN, NaN, 95.0, NaN, NaN, 115.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=1, mName=GPU5, mHotThrottlingThresholds=[NaN, NaN, NaN, 95.0, NaN, NaN, 115.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=1, mName=GPU4, mHotThrottlingThresholds=[NaN, NaN, NaN, 95.0, NaN, NaN, 115.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=0, mName=CPU6, mHotThrottlingThresholds=[NaN, NaN, NaN, 95.0, NaN, NaN, 115.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=1, mName=GPU1, mHotThrottlingThresholds=[NaN, NaN, NaN, 95.0, NaN, NaN, 115.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=1, mName=GPU2, mHotThrottlingThresholds=[NaN, NaN, NaN, 95.0, NaN, NaN, 115.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=1, mName=GPU3, mHotThrottlingThresholds=[NaN, NaN, NaN, 95.0, NaN, NaN, 115.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=0, mName=CPU7, mHotThrottlingThresholds=[NaN, NaN, NaN, 95.0, NaN, NaN, 115.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=1, mName=GPU0, mHotThrottlingThresholds=[NaN, NaN, NaN, 95.0, NaN, NaN, 115.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=0, mName=CPU5, mHotThrottlingThresholds=[NaN, NaN, NaN, 95.0, NaN, NaN, 115.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=8, mName=socd, mHotThrottlingThresholds=[NaN, NaN, NaN, 90.0, NaN, NaN, 99.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=0, mName=CPU3, mHotThrottlingThresholds=[NaN, NaN, NaN, 95.0, NaN, NaN, 115.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=0, mName=CPU2, mHotThrottlingThresholds=[NaN, NaN, NaN, 95.0, NaN, NaN, 115.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=0, mName=CPU1, mHotThrottlingThresholds=[NaN, NaN, NaN, 95.0, NaN, NaN, 115.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=0, mName=CPU4, mHotThrottlingThresholds=[NaN, NaN, NaN, 95.0, NaN, NaN, 115.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=1, mName=GPU7, mHotThrottlingThresholds=[NaN, NaN, NaN, 95.0, NaN, NaN, 115.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
TemperatureThreshold{mType=0, mName=CPU0, mHotThrottlingThresholds=[NaN, NaN, NaN, 95.0, NaN, NaN, 115.0], mColdThrottlingThresholds=[NaN, NaN, NaN, NaN, NaN, NaN, NaN]}
Reference
www.reddit.com/r/Mi9T/comm…
android-review.linaro.org/plugins/git…
上一篇: java 获取 cpu 温度
推荐阅读
-
安卓各部分的温度,以获得探索的逻辑
-
Android 开发中 nodpi、xhdpi、hdpi、mdpi、ldpi 的概念 - 术语和概念 屏幕尺寸 屏幕的物理尺寸,基于屏幕的对角线长度(如 2.8 英寸、3.5 英寸)。 简而言之,安卓系统将所有屏幕尺寸简化为三大类:大、普通和小。 程序可以为这三种屏幕尺寸提供三种不同的布局选项,然后系统会以合适的方式将布局选项呈现到相应的屏幕上,这个过程不需要程序员用代码进行干预。 屏幕纵横比 屏幕的物理长度与物理宽度之比。程序只需使用系统提供的资源分类器 long(长)和 notlong(不长),就能为具有特定长宽比的屏幕提供配制材料。 分辨率 屏幕的像素总数。请注意,分辨率并不意味着长宽比,尽管在大多数情况下,分辨率表示为 "宽度 x 长度"。在安卓系统中,程序一般不直接处理分辨率。 密度 根据屏幕分辨率,沿屏幕宽度和长度排列的像素数量。 密度较低的屏幕在长度和宽度方向上的像素都相对较少,而密度较高的屏幕通常会在同一区域内排列很多甚至非常非常多的像素。屏幕的密度非常重要;例如,一个界面元素(如按钮)的长度和宽度以像素为单位,在低密度屏幕上会显得很大,但在高密度屏幕上就会显得很小。 独立于密度的像素(DIP)是指程序用来定义界面元素的抽象意义上的像素。它作为一个与实际密度无关的单位,帮助程序员构建布局方案(界面元素的宽度、高度和位置)。 与密度无关的像素在逻辑上与像素密度为 160 DPI 的屏幕上的像素大小相同,而 160 DPI 是安卓平台默认的显示设备。在运行时,平台会以目标屏幕的密度为基准,"透明 "地处理所有所需的 DIP 缩放操作。要将与密度无关的像素转换为屏幕像素,可以使用一个简单的公式:像素 = DIP * (密度 / 160)。例如,在 240 DPI 的屏幕上,1 个 DIP 等于 1.5 个物理像素。强烈建议使用 DIP 来定义程序界面的布局,因为这样可以确保用户界面在所有分辨率的屏幕上都能正常显示。 为了简化程序员在面对各种分辨率时的麻烦,也为了让各种分辨率的平台都能直接运行这些程序,Android 平台将所有屏幕以密度和分辨率作为分类方式,分别分为三类:- 三大尺寸:大、普通、小;- 三种不同密度:高(hdpi)、中(mdpi)和低(ldpi)。DPI 表示 "每英寸点数",即每英寸的像素数。如果需要,程序可以为不同的屏幕尺寸提供不同的资源(主要是布局),为不同的屏幕密度提供不同的资源(主要是位图)。除此之外,程序无需对屏幕尺寸或密度进行任何额外处理。执行时,平台会根据屏幕本身的尺寸和密度特性自动加载相应的资源,并将其从逻辑像素(DIP,用于定义界面布局)转换为屏幕上的物理像素。
-
南邮OJ Web任务大揭秘:层层挑战剖析 1. 挑战一:迷宫般的目录探索 题目作者似乎穷举了所有可能的目录组合,最终在404.php中的