12、屏幕与截图:adb shell screencap(截图)、adb shell screenrecord(录屏)、实战:自动化截图脚本。

屏幕操作,是调试过程中最直观的反馈。你写了个界面,跑起来什么样?用户反馈了个Bug,到底看到了什么?这些都得靠截图和录屏来解决。今天我们就来聊聊ADB里这两个非常实用的命令:screencapscreenrecord

我个人习惯,在排查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 显示日志信息,方便调试。
注意: 录屏功能在Android 4.4(API 19)及以上版本才支持。另外,录屏时不能同时进行其他媒体录制(比如用麦克风录音),这是系统限制。

我曾经在测试一个视频播放器时,发现录屏出来的画面总是卡顿。排查了半天,最后发现是比特率设得太低了,导致画面压缩过度。后来把 --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 "所有截图完成!"

这个脚本的逻辑很清晰:

  1. 定义要截图的页面列表(Activity名称)。
  2. 循环启动每个页面,等待加载。
  3. 执行 screencap 截图,拉取到电脑。
  4. 清理设备上的临时文件。

你可以根据自己的需求扩展,比如加上时间戳、截完图后自动用 screenrecord 录一段操作视频,或者集成到CI/CD流水线中。

避坑指南: 我曾经在写自动化脚本时,忘了加 sleep 等待页面加载,结果截到的全是上一个页面的残留画面。后来我改成根据页面上的某个控件出现来判断加载完成,比如用 adb shell uiautomator 等待特定文本出现,这样更可靠。

知识体系图

下面这张图总结了本章的核心知识点,方便你快速回顾:

屏幕与截图 adb shell screencap 基本截图 -p 参数 -d display-id adb shell screenrecord --size 分辨率 --bit-rate 比特率 --time-limit 时长 自动化截图脚本 遍历页面列表 启动Activity + 等待 截图 + 拉取 + 清理

说白了,screencapscreenrecord 就是你在Android调试中的“眼睛”。静态问题用截图,动态问题用录屏,再配合自动化脚本,效率能提升一大截。下次遇到UI相关的Bug,别光靠嘴说“这里有问题”,直接甩一张截图或者一段录屏,沟通成本瞬间降低。


公众号:蓝海资料掘金营,微信deep3321