You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过编程方式获取Android应用的meminfo和cpuinfo数据?

Android应用内获取CPU与内存利用率的实现方案

核心实现路径

内存指标获取

官方提供了稳定的无权限API,和dumpsys meminfo输出的指标完全对齐:

  • 调用ActivityManager.getProcessMemoryInfo(),传入当前进程ID(Process.myPid()),返回的Debug.MemoryInfo对象可直接获取所有常用内存指标:总PSS内存、Java堆内存、Native堆内存、图形内存等核心数值,单位为KB
  • 也可以通过Runtime.getRuntime()直接快速获取Java堆的已用、空闲、总容量,通过Debug类的getNativeHeapAllocatedSize()等方法直接获取Native堆的实时占用。

示例代码:

ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
Debug.MemoryInfo[] memInfo = am.getProcessMemoryInfo(new int[]{Process.myPid()});
// 总PSS内存,和dumpsys meminfo输出的总PSS一致
long totalPssKb = memInfo[0].getTotalPss();
long javaHeapPssKb = memInfo[0].dalvikPss;
long nativeHeapPssKb = memInfo[0].nativePss;

CPU利用率获取

根据Android版本不同有两种实现逻辑:

  • Android 8.0(API 26)及以上版本:系统禁止第三方应用读取/proc/stat的全局CPU统计数据,只能计算自身进程的CPU占比:两次采样获取当前进程的CPU运行时间(Debug.threadCpuTimeNanos())和系统总运行时间(SystemClock.elapsedRealtimeNanos()),用两次采样的差值做除法即可得到时间段内的CPU占比。
  • Android 7.1及以下版本:可以读取/proc/stat获取全局CPU总运行时间,读取/proc/[当前进程ID]/stat获取进程CPU运行时间,同样用两次采样的差值计算占比。

示例计算逻辑:

// 第一次采样记录时间
long cpuTime1 = Debug.threadCpuTimeNanos();
long realTime1 = SystemClock.elapsedRealtimeNanos();
// 间隔固定时间(比如1000ms)后第二次采样
long cpuTime2 = Debug.threadCpuTimeNanos();
long realTime2 = SystemClock.elapsedRealtimeNanos();
// 计算CPU占比,最高值为CPU核心数*100%
double cpuUsage = 100.0 * (cpuTime2 - cpuTime1) / (realTime2 - realTime1);

注意事项

上述所有能力都不需要申请额外权限,仅能获取当前应用自身的运行数据,如需获取设备上其他应用的运行数据,需要申请对应特殊权限或者Root设备。
建议将统计逻辑放到子线程执行,控制采样频率不要过高,避免本身带来额外的性能消耗。


内容的提问来源于stack exchange,提问作者Vinod Jayachandran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 10:06:03