Kotlin开发Android应用如何编程获取CPU/GPU/RAM等硬件信息
Android Kotlin 实现设备硬件信息编程获取
前置配置
在AndroidManifest.xml中添加所需权限:
<!-- Android 12+ 读取部分硬件信息需声明该权限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
注:RAM、CPU基础信息获取无需动态申请权限,部分厂商ROM对系统节点读取做了限制,无权限时会返回兜底值
RAM(运行内存)获取
通过系统ActivityManager服务读取物理内存总大小、可用大小,全版本系统通用:
import android.app.ActivityManager import android.content.Context fun getDeviceRam(context: Context): RamInfo { val am = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager val memInfo = ActivityManager.MemoryInfo() am.getMemoryInfo(memInfo) return RamInfo( totalBytes = memInfo.totalMem, availableBytes = memInfo.availMem, isLowMemory = memInfo.lowMemory ) } data class RamInfo( val totalBytes: Long, val availableBytes: Long, val isLowMemory: Boolean )
返回值单位为字节,可自行除以1024 * 1024 * 1024转换为GB单位。
CPU信息获取
包含CPU型号、物理核心数两个维度,核心数通过系统Runtime接口获取,型号读取系统CPU信息节点兜底:
import android.os.Build import java.io.File fun getCpuInfo(): CpuInfo { // 获取CPU核心数 val coreCount = Runtime.getRuntime().availableProcessors() // 读取CPU型号 var model = "" runCatching { File("/proc/cpuinfo").forEachLine { line -> when { line.contains("model name", true) || line.contains("Hardware", true) || line.contains("Processor", true) -> { val parts = line.split(":") if (parts.size >= 2) { model = parts[1].trim() return@forEachLine } } } } } // 节点读取失败时兜底取系统硬件标识 if (model.isBlank()) model = Build.HARDWARE return CpuInfo( model = model, coreCount = coreCount ) } data class CpuInfo( val model: String, val coreCount: Int )
注:部分定制ROM会修改/proc/cpuinfo节点内容,兜底返回的Build.HARDWARE为硬件板卡标识,和民用CPU型号存在命名差异,属于正常情况
GPU信息获取
Android未提供GPU信息统一读取公开API,型号需通过OpenGL渲染上下文获取,显存仅能通过厂商私有节点读取:
import android.opengl.GLES20 import java.io.File // 必须在GL渲染线程调用,建议在GLSurfaceView.Renderer的onSurfaceCreated回调中执行 fun getGpuModel(): String { return GLES20.glGetString(GLES20.GL_RENDERER) ?: "Unknown" } // 显存仅适配高通、联发科主流芯片,其余品牌芯片需自行匹配对应系统节点 fun getGpuVramBytes(): Long { val nodeList = listOf( "/sys/class/kgsl/kgsl-3d0/mem/max_alloc", // 高通芯片节点 "/sys/module/ged/parameters/gx_mem_total" // 联发科芯片节点 ) nodeList.forEach { path -> runCatching { val file = File(path) if (file.exists()) return file.readText().trim().toLong() } } return 0L } data class GpuInfo( val model: String, val vramBytes: Long )
注:GPU型号无法在主线程直接获取,必须等OpenGL上下文初始化完成后调用;显存无全机型通用获取方案,返回0时代表当前机型未匹配到读取节点
所有硬件信息读取结果均受系统版本、厂商ROM定制策略影响,不存在100%覆盖所有设备的实现方案,业务逻辑必须做好空值、异常值兜底。
内容的提问来源于stack exchange,提问作者Art
相关产品推荐
相关产品推荐

