在 Android 系统中监控某个磁盘的进程或线程的持续读写操作,可以通过以下方法实现。根据设备权限(如是否已 Root)和需求的不同,选择适合的工具或命令:
一、使用系统内置工具和命令
1. 通过 proc
文件系统获取进程 I/O 信息
每个进程的 I/O 统计信息存储在 /proc/[pid]/io
文件中。可以通过以下步骤监控:
-
获取所有进程的 PID:
bash
复制
adb shell ps -A
-
查看某个进程的 I/O 统计:
bash
复制
adb shell cat /proc/[pid]/io
输出示例:
复制
rchar: 12345 # 读取的字符数(包括缓存) wchar: 67890 # 写入的字符数 read_bytes: 1024 # 实际磁盘读取字节数 write_bytes: 2048 # 实际磁盘写入字节数
-
编写脚本动态监控 :
通过定期读取
read_bytes
和write_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:
-
连接设备并启动应用。
-
打开 Android Profiler ,选择 Disk 标签。
-
查看文件读写操作和堆栈跟踪。
2. Systrace 或 Perfetto
通过系统级跟踪工具分析 I/O 行为:
-
生成跟踪文件:
bash
复制
adb shell perfetto --config :disk --out /data/local/tmp/trace.pftrace
-
下载并分析文件(使用 ui.perfetto.dev):
bash
复制
adb pull /data/local/tmp/trace.pftrace
四、内核级监控(需 Root 和内核支持)
1. 使用 ftrace
跟踪块设备 I/O
-
启用块设备跟踪:
bash
复制
adb shell "echo 1 > /sys/kernel/debug/tracing/events/block/enable"
-
捕获事件:
bash
复制
adb shell cat /sys/kernel/debug/tracing/trace_pipe
五、自动化脚本示例
结合 proc
和 grep
编写监控脚本:
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 方法(如 /proc
和 dumpsys
),如需更详细信息再使用 Root 工具(如 strace
或 iotop
)。