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

安卓开发:如何从Debug.MemoryInfo获取字节单位内存大小?

嘿,我来帮你搞定安卓应用里获取运行进程内存的问题!你现在的核心痛点应该是从Debug.MemoryInfo拿到字节单位的内存数据,还有权限配置的问题对吧?我给你一步步拆解:

一、正确获取字节单位的内存数据

你之前可能没注意到,Debug.MemoryInfo里的核心内存方法返回的是千字节(KB),所以要转成字节的话,只需要乘以1024就行!常用的内存指标有这几个,都是实用的:

  • 总PSS内存:getTotalPss() → 这是进程实际占用的物理内存(按共享比例计算后的值,最能反映真实内存使用),转成字节就是getTotalPss() * 1024
  • 私有脏内存:getPrivateDirty() → 进程独占的已修改内存页,字节单位是getPrivateDirty() * 1024
  • 总脏内存:getTotalDirty() → 包含共享部分的总修改内存,字节单位是getTotalDirty() * 1024

举个具体的代码片段,替换你原来的循环部分:

for(Debug.MemoryInfo i : arrayofmem) {
    // 计算总PSS内存(字节)
    long totalPssBytes = i.getTotalPss() * 1024;
    // 如果你要累加总内存,就用这个值
    size += totalPssBytes;
    
    // 也可以按需获取其他内存指标
    long privateDirtyBytes = i.getPrivateDirty() * 1024;
    Log.d("MemoryDebug", "进程私有内存(字节): " + privateDirtyBytes);
}
二、必须配置的权限

要获取进程和内存信息,你得在AndroidManifest.xml里加两个关键权限:

<!-- 获取进程列表的基础权限 -->
<uses-permission android:name="android.permission.GET_TASKS" />
<!-- 高版本安卓(API 19+)需要的内存访问权限 -->
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" />

注意:PACKAGE_USAGE_STATS是系统保护权限,用户没法直接通过常规权限申请弹窗开启,你得在代码里检测权限,引导用户去系统设置开启:

// 检查是否拥有使用情况访问权限
AppOpsManager appOps = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,
        android.os.Process.myUid(), getPackageName());
boolean hasPermission = mode == AppOpsManager.MODE_ALLOWED;

if (!hasPermission) {
    // 跳转到权限设置页面
    Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
    startActivity(intent);
}
三、完整的可运行代码示例

把这些整合起来,完整的实现代码如下,你可以直接参考:

// 获取ActivityManager实例
final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
// 获取当前运行的进程列表
final List<ActivityManager.RunningAppProcessInfo> runningProcesses = activityManager.getRunningAppProcesses();

if (runningProcesses != null) {
    // 遍历每个进程
    for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) {
        // 获取该进程的内存信息数组
        Debug.MemoryInfo[] memoryInfos = activityManager.getProcessMemoryInfo(new int[]{processInfo.pid});
        if (memoryInfos != null && memoryInfos.length > 0) {
            Debug.MemoryInfo memoryInfo = memoryInfos[0];
            
            // 转换为字节单位的内存数据
            long totalPssBytes = memoryInfo.getTotalPss() * 1024;
            long privateDirtyBytes = memoryInfo.getPrivateDirty() * 1024;
            
            // 输出进程信息和内存数据,你可以改成展示在UI上
            Log.d("ProcessMemory", "进程名: " + processInfo.processName 
                    + " | PID: " + processInfo.pid 
                    + " | 总占用内存(字节): " + totalPssBytes);
        }
    }
}
四、额外小提示
  • API版本兼容:getRunningAppProcesses()在API 21之后对系统进程的获取有一定限制,如果你需要获取所有进程,可能需要适配更高版本的API或者用其他方式
  • 性能优化:频繁调用内存获取方法会有性能开销,建议放在子线程执行,不要阻塞主线程

内容的提问来源于stack exchange,提问作者Jyoti JK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:16:01