阳光沙滩
让学习编程变得简单
Android开发如何读取到CPU,内存等硬件温度信息?
发表于 2020-03-18    阅读次数 700

Android开发如何读取到CPU,内存,温度等硬件信息?

最近在玩跑跑卡丁车,有一个面板显示着电呀,CPU使用,内存等情况

于是就来写这篇文章啦

以前我也做过CPU温度,频率之类的数据读取,那时我做的是一个给测试部门的一个工具。测试耐高温情况。还有CPU降频之类的。

那我们怎么样获取到这些硬件信息呢?

如何读取到硬件信息

我们android系统是基于linux内核的,可以理解为一个定制版的linux系统

我们可以adb shell进去shell

然后通过一些指令来查看相关的信息

CPU相关的信息

图片描述

这个是我模拟器的信息

接下来我看一下小米9SE的cpu信息是如何的呢?

图片描述

以及最后一行cpu信息

图片描述

可以看到,是高通的cpu

Hardware        : Qualcomm Technologies, Inc SDMNOBELIUM

获取cpu的名称

我们知道了读取哪个文件,就可以知道了cpu的名称,对吧。我们读取一下不就可以了吗?

接下来我们用android写一个程序获取吧。

创建项目不说了

我们直接就上代码好了

    private fun readCpuInfo() {
        //第一种方法,读取文件
        val cpuInfo = "proc/cpuinfo"
        val fileReader = FileReader(cpuInfo)
        val bf = BufferedReader(fileReader)
        var buf = bf.readLine()
        while (buf != null) {
            if (buf.contains("Hardware")) {
                val cupInfo = buf.split(":")[1]
                Log.d(MainActivity::class.java.name, "cpu is : $cupInfo")
                break
            }
            buf = bf.readLine()
        }

        //第二种方法,通过系统的API获取
        val cpuName = android.os.Build.HARDWARE
        Log.d(MainActivity::javaClass.name, "cpu name is -- > $cpuName")
    }

执行结果:

cpu is :  Qualcomm Technologies, Inc SDMNOBELIUM
cpu name is -- > qcom

获取cpu的频率

 val maxFreqInfo = "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq"
 val minFreqInfo = "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq"

一个是最高频率,一个最低频率。

如果不知道如何读取,我们可以先在shell里查看一下

图片描述

可以看到,这个手机最高是1.7G赫兹

图片描述

最低是0.3G赫兹

这样一来,我们用代码读取不就很方便了嘛

   private fun getCpuFreq() {
        //在我们读取之前,可以先在shell里读取一下,查看一下
        val maxFreqInfo = "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq"
        val minFreqInfo = "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq"
        val maxFileReader = FileReader(maxFreqInfo)
        val maxBf = BufferedReader(maxFileReader)
        val maxFreq = maxBf.readLine()
        Log.d(MainActivity::class.java.name, "max freq == > $maxFreq")

        val minFileReader = FileReader(minFreqInfo)
        val minBf = BufferedReader(minFileReader)
        val minFreq = minBf.readLine()
        Log.d(MainActivity::class.java.name, "max freq == > $minFreq")

        //单位自行转换啦
    }

执行结果:

max freq == > 1708800
max freq == > 300000

获取cpu核心数和架构类型

  • cpu的核心数

获取核心数就是数文件夹个数

/sys/devices/system/cpu/

这个目录下有多少个cpu文件夹,就有多少核

图片描述

看图,8核

用java怎么去写呢?

 private fun getCpuCoreCountAndType() {
        val cpuPath = "/sys/devices/system/cpu/"
        val cpuCoreDir = File(cpuPath)
        val listFiles = cpuCoreDir.listFiles(object : FileFilter {
            override fun accept(pathname: File?): Boolean {
                val pattern = "cpu\\d"
                val compile = Pattern.compile(pattern)
                val matcher = compile.matcher(pathname?.name!!)
                return matcher.matches()
            }
        })
        Log.d(MainActivity::class.java.name, "cpu core size == > ${listFiles.size}")
    }

输出结果:

8核心

cpu core size == > 8
  • cpu架构支持
private fun getCpuCoreCountAndType() {
        //cpu核心数
        val cpuPath = "/sys/devices/system/cpu/"
        val cpuCoreDir = File(cpuPath)
        val listFiles = cpuCoreDir.listFiles(object : FileFilter {
            override fun accept(pathname: File?): Boolean {
                val pattern = "cpu\\d"
                val compile = Pattern.compile(pattern)
                val matcher = compile.matcher(pathname?.name!!)
                return matcher.matches()
            }
        })
        Log.d(MainActivity::class.java.name, "cpu core size == > ${listFiles.size}")
        //cpu类型
        val type = android.os.Build.SUPPORTED_ABIS
        for (s in type) {
            Log.d(MainActivity::javaClass.name, "cup type support $s")
        }
    }

执行结果:

cup type support arm64-v8a
cup type support armeabi-v7a
cup type support armeabi

cpu的温度读取

温度读取是哪佣文件呢?

/sys/class/thermal/thermal_zone9/subsystem/thermal_zone9/temp

我们读取这个文件,就可以获取到温度了

图片描述

代码放一起吧

     private fun getCpuTemInfo() {
        //cpu温度
        val tempInfoPath = "/sys/class/thermal/thermal_zone9/subsystem/thermal_zone9/temp"
        val temReader = FileReader(tempInfoPath)
        val temBf = BufferedReader(temReader)
        val temInfo = temBf.readLine()
        //单位自行转换
        Log.d(MainActivity::javaClass.name, "cpu temp info -- > $temInfo")
    }

读取结果:

cpu temp info -- > 37200

内存

内存信息的获取跟cpu的差不多呀,同学们应该可以举一反三。掌握了一个,就学会了其他的获取。

内存的话涉及到

  • 温度
  • 大小

内存大小

我们可以通过这个路径读取内存信息

/proc/meminfo

读取下来,我们可以看看我这个小米9SE的低配版本

grus:/ $ cat /proc/meminfo
cat /proc/meminfo
MemTotal:        5751560 kB
MemFree:          228700 kB
MemAvailable:    3134528 kB
Buffers:           87240 kB
Cached:          2419664 kB
SwapCached:        15960 kB
Active:          2510412 kB
Inactive:         965780 kB
Active(anon):     759200 kB
Inactive(anon):   339928 kB
Active(file):    1751212 kB
Inactive(file):   625852 kB
Unevictable:      129536 kB
Mlocked:          129536 kB
SwapTotal:       2621436 kB
SwapFree:        2074052 kB
Dirty:               164 kB
Writeback:           132 kB
AnonPages:       1089936 kB
Mapped:           725596 kB
Shmem:               920 kB
Slab:             602388 kB
SReclaimable:     236980 kB
SUnreclaim:       365408 kB
KernelStack:       56224 kB
PageTables:        72492 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     5497216 kB
Committed_AS:   87214652 kB
VmallocTotal:   263061440 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
CmaTotal:         200704 kB
CmaFree:           55364 k

MemTotal这个是总内存了吧,可以读取到了吧。

内存温度数据

我以前做mtk平台的系统时可以获取到,这个高通的,也不知道它的硬件类型呀。对吧

我们怎么知道应先类型呢?

读取这些目录下的内容即可

cat /sys/class/thermal/thermal_zone[0~9]/type

我这里没法做这个实验了,没有mtk的手机

高通的我也不知道哪个是内存,也可能不支持获取内存温度

有了类型,如何获取温度呢

前面我们获取cpu的温度,读取这个路径

/sys/class/thermal/thermal_zone9/subsystem/thermal_zone9/temp

因为我们9的类型是cpu

如果我们找到了内存,也可以读取对应的温度值了。