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
如果我们找到了内存,也可以读取对应的温度值了。