12、屏幕与截图:adb shell screencap(截图)、adb shell screenrecord(录屏)、实战:自动化截图脚本。
屏幕操作,是调试过程中最直观的反馈。你写了个界面,跑起来什么样?用户反馈了个Bug,到底看到了什么?这些都得靠截图和录屏来解决。今天我们就来聊聊ADB里这两个非常实用的命令:screencap 和 screenrecord。
我个人习惯,在排查UI问题时,第一反应就是先截一张图看看。别笑,很多时候问题就出在布局错乱或者资源没加载上,一张图就能说明白。
adb shell screencap:截图命令
这个命令很简单,就是给当前屏幕拍个快照。它的用法非常直接:
adb shell screencap /sdcard/screenshot.png
这条命令会把当前屏幕内容保存到设备的 /sdcard/screenshot.png 路径下。注意,这里保存的是PNG格式,无损压缩,质量很好。
然后你需要把它拉到电脑上:
adb pull /sdcard/screenshot.png ./
这样,截图就到你的当前目录了。
adb exec-out screencap -p > screenshot.png
这条命令直接通过标准输出流把截图数据传到电脑上,不用在设备里存临时文件。我个人经常用这个,尤其是在写自动化脚本的时候。
screencap 的常用参数
其实 screencap 的参数不多,但有几个挺实用:
| 参数 | 说明 |
|---|---|
-p |
指定输出为PNG格式。默认就是PNG,但加上更保险。 |
-d display-id |
指定显示屏ID。如果你的设备有多个屏幕(比如折叠屏),可以用这个参数指定截哪个屏。 |
--help |
查看帮助信息。 |
嗯,这里要注意:screencap 截的是当前屏幕的原始内容,不会包含状态栏上的实时时间(除非你截图时刚好在变化)。它就是个静态快照。
adb shell screenrecord:录屏命令
截图只能看一瞬间,但很多问题需要看过程,比如动画卡顿、滑动流畅度、用户操作路径等。这时候就得用 screenrecord 了。
基本用法:
adb shell screenrecord /sdcard/demo.mp4
执行后,设备会开始录屏,直到你按 Ctrl+C 停止,或者达到默认的时间限制(3分钟)。录好的视频保存在 /sdcard/demo.mp4。
同样,用 adb pull 拉取到电脑:
adb pull /sdcard/demo.mp4 ./
screenrecord 的常用参数
这个命令的参数就丰富多了,我挑几个最常用的说说:
| 参数 | 说明 |
|---|---|
--size WxH |
设置视频分辨率。比如 --size 720x1280。默认是屏幕原始分辨率,但文件会很大。 |
--bit-rate N |
设置视频比特率,单位是Mbps。比如 --bit-rate 4M。默认是4Mbps,调低可以减小文件体积。 |
--time-limit N |
设置录制时长,单位是秒。最长180秒(3分钟)。 |
--rotate |
旋转输出视频。如果你的应用是横屏的,加上这个参数可以避免视频是竖着的。 |
--verbose |
显示日志信息,方便调试。 |
我曾经在测试一个视频播放器时,发现录屏出来的画面总是卡顿。排查了半天,最后发现是比特率设得太低了,导致画面压缩过度。后来把 --bit-rate 调到8M,问题就解决了。你想想看,录屏本身也是资源消耗,参数设置不合理,反而会影响测试结果。
实战:自动化截图脚本
光讲命令没意思,我们来写个实用的自动化截图脚本。这个脚本可以帮你批量截图,比如遍历App的每个页面,自动保存截图,方便做UI对比或者文档整理。
下面是一个Bash脚本示例:
#!/bin/bash
# 自动化截图脚本 - 遍历页面并截图
# 设置截图保存目录
SCREENSHOT_DIR="./screenshots"
mkdir -p $SCREENSHOT_DIR
# 定义要截图的页面列表(这里用Activity名称举例)
PAGES=(
"com.example.app/.MainActivity"
"com.example.app/.SettingsActivity"
"com.example.app/.ProfileActivity"
)
# 截图函数
take_screenshot() {
local page_name=$1
local output_file="${SCREENSHOT_DIR}/${page_name}.png"
echo "正在截图: $page_name"
# 启动Activity
adb shell am start -n $page_name
sleep 2 # 等待页面加载
# 截图并保存到设备
adb shell screencap -p /sdcard/temp_screenshot.png
# 拉取到电脑
adb pull /sdcard/temp_screenshot.png $output_file
# 清理设备上的临时文件
adb shell rm /sdcard/temp_screenshot.png
echo "截图已保存: $output_file"
}
# 主循环
for page in "${PAGES[@]}"; do
# 提取页面简称作为文件名
page_name=$(echo $page | awk -F'/' '{print $NF}')
take_screenshot $page_name
done
echo "所有截图完成!"
这个脚本的逻辑很清晰:
- 定义要截图的页面列表(Activity名称)。
- 循环启动每个页面,等待加载。
- 执行
screencap截图,拉取到电脑。 - 清理设备上的临时文件。
你可以根据自己的需求扩展,比如加上时间戳、截完图后自动用 screenrecord 录一段操作视频,或者集成到CI/CD流水线中。
sleep 等待页面加载,结果截到的全是上一个页面的残留画面。后来我改成根据页面上的某个控件出现来判断加载完成,比如用 adb shell uiautomator 等待特定文本出现,这样更可靠。
知识体系图
下面这张图总结了本章的核心知识点,方便你快速回顾:
说白了,screencap 和 screenrecord 就是你在Android调试中的“眼睛”。静态问题用截图,动态问题用录屏,再配合自动化脚本,效率能提升一大截。下次遇到UI相关的Bug,别光靠嘴说“这里有问题”,直接甩一张截图或者一段录屏,沟通成本瞬间降低。