Android 中 如何监控 某个磁盘有哪些进程或线程在持续的读写

在 Android 系统中监控某个磁盘的进程或线程的持续读写操作,可以通过以下方法实现。根据设备权限(如是否已 Root)和需求的不同,选择适合的工具或命令:


一、使用系统内置工具和命令

1. 通过 proc 文件系统获取进程 I/O 信息

每个进程的 I/O 统计信息存储在 /proc/[pid]/io 文件中。可以通过以下步骤监控:

  1. 获取所有进程的 PID

    bash

    复制

    复制代码
    adb shell ps -A
  2. 查看某个进程的 I/O 统计

    bash

    复制

    复制代码
    adb shell cat /proc/[pid]/io

    输出示例:

    复制

    复制代码
    rchar: 12345      # 读取的字符数(包括缓存)
    wchar: 67890      # 写入的字符数
    read_bytes: 1024  # 实际磁盘读取字节数
    write_bytes: 2048 # 实际磁盘写入字节数
  3. 编写脚本动态监控

    通过定期读取 read_byteswrite_bytes 的变化,找出持续读写的进程。

    bash

    复制

    复制代码
    # 监控所有进程的磁盘读写
    adb shell "
      while true; do
        for pid in \$(ls /proc | grep '^[0-9]\+$'); do
          if [ -f /proc/\$pid/io ]; then
            echo \"PID: \$pid\"
            grep 'read_bytes\|write_bytes' /proc/\$pid/io
          fi
        done
        sleep 1
        clear
      done
    "

2. 使用 dumpsys 命令获取磁盘统计

Android 的 dumpsys 可以输出磁盘使用情况,但信息较为概括:

bash

复制

复制代码
adb shell dumpsys diskstats

输出示例:

复制

复制代码
Latency: 1ms [100ms]
Data-Free: 12345678K /data-free
System-Free: 2345678K /system-free
...

3. 使用 strace 跟踪系统调用

通过 strace 监控进程的文件读写操作(需 Root 权限):

bash

复制

复制代码
# 跟踪某个进程的所有文件读写操作
adb shell strace -p [pid] -e trace=read,write
  • 缺点:性能开销大,仅适合短时间调试。

二、使用第三方工具

1. iotop(需 Root 或自定义内核支持)

iotop 类似 Linux 的 top,但专注于磁盘 I/O。若设备支持,安装后可直接运行:

bash

复制

复制代码
adb shell iotop

输出示例:

复制

复制代码
  PID   PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
 1234   be/3 root        0.00 B      3.76 K  0.00 %  0.00 % some_process

2. lsof(需 Root 或 Busybox)

查看哪些进程打开了特定文件或目录:

bash

复制

复制代码
# 查看访问某个路径的进程
adb shell lsof /sdcard/example.txt

三、使用性能分析工具

1. Android Profiler(针对应用开发者)

在 Android Studio 中,使用 Profiler 监控应用的磁盘 I/O:

  1. 连接设备并启动应用。

  2. 打开 Android Profiler ,选择 Disk 标签。

  3. 查看文件读写操作和堆栈跟踪。


2. Systrace 或 Perfetto

通过系统级跟踪工具分析 I/O 行为:

  1. 生成跟踪文件:

    bash

    复制

    复制代码
    adb shell perfetto --config :disk --out /data/local/tmp/trace.pftrace
  2. 下载并分析文件(使用 ui.perfetto.dev):

    bash

    复制

    复制代码
    adb pull /data/local/tmp/trace.pftrace

四、内核级监控(需 Root 和内核支持)

1. 使用 ftrace 跟踪块设备 I/O
  1. 启用块设备跟踪:

    bash

    复制

    复制代码
    adb shell "echo 1 > /sys/kernel/debug/tracing/events/block/enable"
  2. 捕获事件:

    bash

    复制

    复制代码
    adb shell cat /sys/kernel/debug/tracing/trace_pipe

五、自动化脚本示例

结合 procgrep 编写监控脚本:

bash

复制

复制代码
#!/bin/bash
# 监控指定磁盘路径的读写进程(例如 /sdcard)
adb shell "
  while true; do
    echo '===== $(date) ====='
    for pid in \$(lsof | grep '/sdcard' | awk '{print \$2}' | sort -u); do
      if [ -f /proc/\$pid/io ]; then
        echo \"PID: \$pid \$(cat /proc/\$pid/cmdline)\"
        grep 'read_bytes\|write_bytes' /proc/\$pid/io
      fi
    done
    sleep 2
  done
"

总结

方法 适用场景 所需权限
/proc/[pid]/io 进程级 I/O 统计 无需 Root
dumpsys diskstats 系统级磁盘使用概览 无需 Root
strace 实时跟踪文件读写系统调用 Root 权限
iotop/lsof 实时监控高 I/O 进程 Root 或 Busybox
Android Profiler 应用开发调试 无需 Root
内核跟踪(ftrace) 深度分析块设备 I/O Root 和内核支持

根据需求选择合适的工具,优先尝试非 Root 方法(如 /procdumpsys),如需更详细信息再使用 Root 工具(如 straceiotop)。

相关推荐
-优势在我4 小时前
Android TabLayout 实现随意控制item之间的间距
android·java·ui
hedalei4 小时前
android13修改系统Launcher不跟随重力感应旋转
android·launcher
Indoraptor6 小时前
Android Fence 同步框架
android
峥嵘life6 小时前
DeepSeek本地搭建 和 Android
android
叶羽西6 小时前
Android14 Camera框架中Jpeg流buffer大小的计算
android·安卓
AnalogElectronic9 小时前
问题记录,在使用android studio 构建项目时遇到的问题
android·ide·android studio
我爱松子鱼9 小时前
mysql之InnoDB Buffer Pool 深度解析与性能优化
android·mysql·性能优化
江上清风山间明月12 小时前
Flutter开发的应用页面非常多时如何高效管理路由
android·flutter·路由·页面管理·routes·ongenerateroute
子非衣16 小时前
MySQL修改JSON格式数据示例
android·mysql·json