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

相关推荐
zimoyin3 小时前
kotlin Android AccessibilityService 无障碍入门
android·开发语言·kotlin
韩仔搭建15 小时前
第二章:安卓端启动流程详解与疑难杂症调试手册
android·ui·娱乐
A-花开堪折15 小时前
Android7 Input(七)App与input系统服务建立连接
android
冰糖葫芦三剑客15 小时前
Android 自定义悬浮拖动吸附按钮
android
吃汉堡吃到饱15 小时前
【Android】从Choreographer到UI渲染(二)
android·ui
微信公众号:AI创造财富15 小时前
显示的图标跟UI界面对应不上。
android·ui
aningxiaoxixi15 小时前
安卓 Audio Stream 类型
android
奔跑吧 android15 小时前
【android bluetooth 协议分析 01】【HCI 层介绍 3】【NUMBER_OF_COMPLETED_PACKETS 事件介绍】
android·bluetooth·hci·bt·gd·aosp13
_龙小鱼_18 小时前
Kotlin扩展简化Android动画开发
android·开发语言·kotlin
奔跑吧 android18 小时前
【android bluetooth 协议分析 01】【HCI 层介绍 6】【WriteLeHostSupport命令介绍】
android·bluetooth·bt·gd·aosp13·writelehostsup·hcicmd