作为一名移动端开发工程师,我经常需要在真机调试时快速获取设备屏幕状态。Android系统自带的screencap和screenrecord命令行工具,是我们在ADB调试中最常用的屏幕捕获方案。与第三方工具相比,它们无需额外安装、兼容性好,特别适合自动化测试和批量操作场景。
这两个工具都位于/system/bin/目录下,通过ADB Shell即可调用。screencap用于静态截图,支持PNG/JPEG/WEBP格式;screenrecord则是动态录屏工具,可生成MP4视频文件。它们最大的优势是系统级支持,从Android 4.4开始就内置在系统中,不需要root权限即可使用。
注意:部分厂商定制ROM可能会修改工具路径或参数,遇到命令失效时建议检查/system/bin/下是否存在对应可执行文件。
最基础的截屏命令如下:
bash复制adb shell screencap -p /sdcard/screenshot.png
其中:
-p 指定输出为PNG格式(默认)如果想查看所有支持参数,可以运行:
bash复制adb shell screencap --help
典型输出会显示:
code复制--help show this message
-p use png compression
-j use jpeg compression
-q <quality> jpeg quality (0-100)
--display-id specify display id to capture
对于JPEG格式,可以通过-q参数控制压缩质量:
bash复制adb shell screencap -j -q 80 /sdcard/screen.jpg
质量范围0-100,数值越大文件体积越大。实测在80左右能在清晰度和文件大小间取得较好平衡。
从Android 9开始支持--display-id参数,适用于折叠屏或多屏设备:
bash复制adb shell screencap --display-id 1 /sdcard/main.png
adb shell screencap --display-id 2 /sdcard/second.png
通过管道可以不经过设备存储直接获取截图:
bash复制adb exec-out screencap -p > local.png
这种方式特别适合自动化测试脚本,避免了清理设备存储的步骤。
问题1:截图出现色差
部分设备截图颜色异常,通常是因为:
解决方案:
问题2:截图权限被拒绝
如果出现"Permission denied"错误,尝试:
标准录屏命令格式:
bash复制adb shell screenrecord /sdcard/demo.mp4
录制过程中:
bash复制adb shell screenrecord --size 1280x720 --bit-rate 4000000 /sdcard/hd.mp4
--size:设置分辨率(宽x高)--bit-rate:码率(bps),默认4Mbps建议:
bash复制adb shell screenrecord --time-limit 30 --rotate /sdcard/30s.mp4
--time-limit:最长录制秒数(默认180)--rotate:输出旋转90度的视频bash复制adb shell screenrecord --fps 60 --audio /sdcard/withaudio.mp4
--fps:帧率(默认设备刷新率)--audio:录制系统内部音频(需要Android 10+)注意:音频录制可能因DRM限制而失败,且不同厂商实现差异较大
bash复制adb shell screenrecord --size 720x1280 --bit-rate 2000000 /sdcard/optimized.mp4
--bugreport参数添加时间戳(调试用)--time-limit 300延长到5分钟adb shell df /sdcard在UI自动化测试中,可以结合MonkeyRunner实现异常捕获:
python复制from com.android.monkeyrunner import MonkeyRunner
device = MonkeyRunner.waitForConnection()
device.shell('screenrecord --time-limit 30 /sdcard/test.mp4 &')
# 执行测试步骤...
device.shell('killall screenrecord')
使用ffmpeg处理录屏文件:
bash复制# 裁剪前10秒
ffmpeg -ss 10 -i input.mp4 -c copy output.mp4
# 加速2倍
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" fast.mp4
# 添加水印
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" watermarked.mp4
通过adb devices实现批量录制:
bash复制for device in $(adb devices | grep -v List | cut -f1); do
adb -s $device shell screenrecord /sdcard/${device}.mp4 &
done
问题1:录屏文件损坏
可能原因:
修复方法:
bash复制ffmpeg -i corrupted.mp4 -c copy fixed.mp4
问题2:高刷新率设备录制掉帧
解决方案:
--fps 60或--fps 120adb shell settings put global animator_duration_scale 0问题3:华为/小米设备异常
厂商定制问题处理:
/system/bin/screenrecordadb shell ls -l /system/bin/screenrecordhdc screenrecord)| 特性 | 系统工具 | SCRCPY | AZ Screen Recorder |
|---|---|---|---|
| 需要root | ❌ | ❌ | ❌ |
| 最高分辨率 | 设备原生 | 1080p | 设备原生 |
| 音频录制 | Android 10+ | ❌ | ✔️ |
| 帧率控制 | ✔️ | ✔️ | ✔️ |
| 命令行支持 | ✔️ | ✔️ | ❌ |
在实际项目中,我通常会根据以下流程决策:
bash复制# 传统方式(慢)
adb shell screencap -p /sdcard/1.png && adb pull /sdcard/1.png
# 优化方式(快3倍)
adb exec-out screencap -p > 1.png
bash复制adb shell settings put system pointer_location 1
adb shell screenrecord --bugreport /sdcard/touch.mp4
bash复制# 每60秒保存一个文件
for i in {1..3}; do
adb shell screenrecord --time-limit 60 /sdcard/part$i.mp4
done
bash复制# 生成测试图
adb shell am start -n com.android.graphics/com.android.graphics.TestActivity
# 截图分析
adb exec-out screencap -p > test.png
通过这些年的实践,我发现系统工具虽然功能简单,但在可靠性和兼容性上远超第三方方案。特别是在持续集成环境中,系统工具的稳定性至关重要。建议开发者掌握这些"瑞士军刀"般的基础工具,它们往往能在关键时刻解决大问题。