如何通过编程方式获取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
相关产品推荐
相关产品推荐

