Android 查看手机内存使用情况(/proc/meminfo)

    在Android开发和测试中,有时候需要获取手机的总内存和可用内存大小,这个该如何实现呢?

   我们可以通过读取文件"/proc/meminfo"的信息获取手机Memory的总量,而通过ActivityManager.getMemoryInfo(ActivityManager.MemoryInfo)方法可以获取当前的可用Memory量。

   "/proc/meminfo"文件记录了android手机的一些内存信息,在命令行窗口里输入"adb shell",进入shell环境,输入"cat /proc/meminfo"即可在命令行里显示meminfo文件的内容具体如下所示。

cat /proc/meminfo
MemTotal:        2806760 kB
MemFree:          197620 kB
Buffers:           56696 kB
Cached:           909360 kB
SwapCached:            0 kB
Active:          1406036 kB
Inactive:         476540 kB
Active(anon):     924492 kB
Inactive(anon):    11664 kB
Active(file):     481544 kB
Inactive(file):   464876 kB
Unevictable:        7832 kB
Mlocked:              80 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        924252 kB
Mapped:           217876 kB
Shmem:             11884 kB
Slab:             306808 kB
SReclaimable:      78768 kB
SUnreclaim:       228040 kB
KernelStack:       33360 kB
PageTables:        34480 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     1403380 kB
Committed_AS:   93553728 kB
VmallocTotal:   251658176 kB
VmallocUsed:      110656 kB
VmallocChunk:   251386276 kB

MemTotal: 所有可用RAM大小(即物理内存减去一些预留位和内核的二进制代码大小)。

MemFree:被系统留着未使用的内存。

Buffers: 用来给文件做缓冲的大小。

Cached: 被高速缓冲存储器(cache memory)用的内存的大小(等于 diskcache minus SwapCache ).

SwapCached:swap 缓存的大小,Android很少使用swap的,经常为0。被高速缓冲存储器(cache memory)用来交换空间的大小,用来在需要的时候很快的被替换而不需要再次打开I/O端口。

Active: 在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,除非非常必要,否则不会被移作他用。

Inactive: 在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其他途径。

SwapTotal: 交换空间的总大小。

SwapFree: 未被使用交换空间的大小。

要获取android手机总内存大小,只需读取"/proc/meminfo"文件的第1行,并进行简单的字符串处理即可。

同时可以通过代码获取总内存和可用内存。

private String getAvailMemory() {// 获取android当前可用内存大小 

    ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    MemoryInfo mi = new MemoryInfo();
    am.getMemoryInfo(mi);
    //mi.availMem; 当前系统的可用内存 

    return Formatter.formatFileSize(getBaseContext(), mi.availMem);// 将获取的内存大小规格化 
}
private String getTotalMemory() {
    String str1 = "/proc/meminfo";// 系统内存信息文件 
    String str2;
    String[] arrayOfString;
    long initial_memory = 0;

    try {
        FileReader localFileReader = new FileReader(str1);
        BufferedReader localBufferedReader = new BufferedReader(
            localFileReader, 8192);
        str2 = localBufferedReader.readLine();// 读取meminfo第一行,系统总内存大小 

        arrayOfString = str2.split("\\s+");
        for (String num : arrayOfString) {
            Log.i(str2, num + "\t");
        }

        initial_memory = Integer.valueOf(arrayOfString[1]).intValue() * 1024;// 获得系统总内存,单位是KB,乘以1024转换为Byte 
        localBufferedReader.close();

    } catch (IOException e) {
    }
    return Formatter.formatFileSize(getBaseContext(), initial_memory);// Byte转换为KB或者MB,内存大小规格化 
}

<think>我们正在分析Android设备从2+16G升级到3+32G后开机白屏的问题。用户已经通过/proc/meminfo检查了MemTotal,确认系统识别到了3GB内存。现在需要进一步分析可能的原因。 根据之前的知识,虽然内存识别正确,但白屏问题可能源于以下几个方面: 1. 系统渲染服务(如SurfaceFlinger)在内存升级后配置未更新,导致显存分配问题。 2. 系统缓存未清除,旧缓存与新硬件配置冲突。 3. 内核内存管理策略未适应新的内存大小,导致图形缓冲区分配失败。 接下来,我们将深入分析这些可能性,并提供具体的诊断和解决步骤。</think>### Android R 内存升级后白屏问题分析(基于 `/proc/meminfo` 结果) 当 Android R 设备从 2+16GB 升级到 3+32GB 后出现开机白屏但 Layout Inspector 显示布局正常时,结合 `/proc/meminfo` 的 `MemTotal` 检测结果,以下是系统化分析: --- #### 一、核心问题诊断(基于内存检测结果) 1. **内存识别验证** 通过 `/proc/meminfo` 确认 `MemTotal` 值: ```bash adb shell cat /proc/meminfo | grep MemTotal ``` - ✅ 若显示 ≈3GB(如 `MemTotal: 2941000 kB`):系统已识别新内存 - ❌ 若显示 ≈2GB:硬件兼容性问题(需检查内存颗粒兼容性) 2. **内存升级引发的白屏关键原因** - **显存分配失衡**:GPU 显存未随系统内存增加而重新分配,导致渲染缓冲区不足 - **ION 内存池未更新**:Android 图形系统的 ION 内存分配器未适配新内存配置[^1] - **内核内存碎片**:大内存设备需要调整 `vm.min_free_kbytes` 防止图形内存碎片化 - **ZRAM 配置冲突**:旧 ZRAM 压缩比设置导致显存被过度压缩 --- #### 二、解决方案(分步执行) ##### ▶ 步骤1:验证并修复显存分配 ```bash # 检查当前GPU显存分配 adb shell dumpsys SurfaceFlinger | grep -E "GPU memory|Allocated buffers" # 调整显存比例(需root) adb shell "echo 'debug.sf.gpu_memory_ratio=0.35' >> /system/build.prop" adb reboot ``` **参数说明**: - `gpu_memory_ratio` 从默认 0.25 提升到 0.35,为 3GB 设备增加显存配额 - 验证命令:`adb shell getprop debug.sf.gpu_memory_ratio` ##### ▶ 步骤2:重建 ION 内存池 ```bash # 释放现有ION内存 adb shell "echo 1 > /sys/kernel/debug/ion/clients/system_server/export_dump" # 调整ION内存池大小(需自定义内核) adb shell "echo 'pool_size=104857600' > /sys/kernel/debug/ion/heaps/system" ``` **原理**:将系统堆内存池从默认 50MB 扩展到 100MB,适配 3GB 内存[^2] ##### ▶ 步骤3:优化内核内存管理 ```bash # 防止内存碎片化(需root) adb shell "echo '8192' > /proc/sys/vm/min_free_kbytes" # 从4096提升到8192 adb shell "echo '1' > /proc/sys/vm/compact_memory" # 强制内存压缩 # 调整Swappiness减少ZRAM影响 adb shell "echo '60' > /proc/sys/vm/swappiness" # 默认值100→60 ``` ##### ▶ 步骤4:强制刷新图形服务 ```bash # 重置SurfaceFlinger adb shell pkill -l 9 surfaceflinger adb shell pkill -l 9 system_server # 清除缓存 adb shell pm clear com.android.systemui ``` --- #### 三、深度调试方案 1. **内存映射分析** ```bash # 检查GPU内存映射状态 adb shell cat /d/kgsl/proc/mem # 查看图形缓冲区分配 adb shell dumpsys SurfaceFlinger | grep "Total buffers" ``` 2. **关键日志过滤** ```bash adb logcat -b all | grep -E "EGL|Adreno|gralloc|hwcomposer" ``` **典型错误处理**: - `EGL_BAD_ALLOC` → 执行步骤1增加显存比例 - `ION_IOC_ALLOC failed` → 执行步骤2扩展ION内存池 - `hwcomposer: failed to allocate buffer` → 执行步骤3优化内存碎片 3. **硬件加速降级方案** 在 `/system/etc/permissions/` 添加配置: ```xml <!-- hardware_accelerated_override.xml --> <permissions> <disable-hardware-acceleration package="com.android.systemui" /> </permissions> ``` --- ### 问题解决流程图 ```mermaid graph TD A[开机白屏] --> B{/proc/meminfo 结果} B -->|MemTotal≈3GB| C[修复显存分配] C --> D[重建ION内存池] D --> E[优化内核参数] E --> F{问题解决?} F -->|是| G[完成] F -->|否| H[分析dmesg日志] H --> I[检查硬件兼容性] ``` > **重要提示**:首次启动可能需 3-5 分钟完成内存自适应,请勿强制重启。若设备为 MTK 平台,需额外检查 `mediatek_memcfg` 驱动日志。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值