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)。

相关推荐
踢球的打工仔3 小时前
PHP面向对象(7)
android·开发语言·php
安卓理事人3 小时前
安卓socket
android
安卓理事人9 小时前
安卓LinkedBlockingQueue消息队列
android
万能的小裴同学10 小时前
Android M3U8视频播放器
android·音视频
q***577411 小时前
MySql的慢查询(慢日志)
android·mysql·adb
JavaNoober11 小时前
Android 前台服务 "Bad Notification" 崩溃机制分析文档
android
城东米粉儿12 小时前
关于ObjectAnimator
android
zhangphil13 小时前
Android渲染线程Render Thread的RenderNode与DisplayList,引用Bitmap及Open GL纹理上传GPU
android
火柴就是我14 小时前
从头写一个自己的app
android·前端·flutter
lichong95115 小时前
XLog debug 开启打印日志,release 关闭打印日志
android·java·前端