Screengrab (Fastlane) — 是什么、功能与截图自动化

作者: IT Sectr 发布日期: 2026-04-15 阅读时间: 8 分钟

Screengrab 是 Fastlane 生态系统中的一个工具,用于自动化创建 Android 和 iOS 移动应用的截图。开发人员无需在数十台设备上手动滚动屏幕,只需运行一个命令,Screengrab 就会自动拍摄所有所需屏幕的截图。根据 Fastlane Docs, 2026,该工具同时支持多达 30 种语言和配置中指定的任何屏幕分辨率。

要点

  • Screengrab — 用于自动创建 Android 和 iOS 移动应用截图的 Fastlane 工具。
  • 自动化 用一个终端命令取代了手动创建数百张截图的工作。
  • 本地化 — 无需额外设置即可同时生成数十种语言的截图。
  • CI/CD — 与任何流水线集成:Jenkins、GitHub Actions、GitLab CI。
  • 灵活性 — 一次运行支持多台设备、多种方向和多种语言。

什么是 Screengrab 以及为什么需要它

Screengrab — 是 Fastlane 生态系统中的一个组件,用于自动化创建移动应用的截图。该工具于 2015 年出现,旨在解决一个问题:在 Google Play 和 App Store 上发布时,每种语言需要 4 到 10 张截图。如果支持 30 种语言,这意味着需要 120–300 张手动拍摄的图片。

手动创建截图的问题

开发人员需要手动在模拟器或设备上运行应用,滚动到所需屏幕,截取屏幕截图,将其传输到计算机,裁剪并保存到正确的文件夹中。这个过程需要为每种语言和每个方向重复进行。根据 Google Play Console 的数据,普通应用每两周更新一次,这使得截图成为常规性工作。

自动化的优势

Screengrab 从根本上解决了问题:开发人员用 UI 框架(Android 用 Espresso,iOS 用 XCTest)描述测试场景,Screengrab 则自动在所有需要的设备和语言上运行它们。Fastlane 协调整个过程:编译构建、运行测试、收集截图并将其打包到正确的文件夹结构中。

结果 — 10–15 分钟内生成一百张截图,而不是几个小时的手动工作。Google 建议在每次界面发生重大变化时更新截图,而没有自动化,这一建议往往被忽略。

Screengrab 的工作原理:架构和运行原理

架构 Screengrab 围绕两个关键组件构建:设备上的客户端(screengrab-lib)和管理测试运行及结果收集的运行器。Android 使用仪器测试框架,iOS 使用 XCTest。

一次运行的生命周期

Fastlane 调用 screengrab 操作,读取 Screengrabfile 配置文件。运行器编译带有 screengrab-lib 库的测试 APK,将其安装到连接的设备或模拟器上,并运行标记了截图注释的 UI 测试。

ruby
# Fastfile — 用于截图的 lane 描述
lane :screenshots do
  capture_android_screenshots(
    output_directory: "fastlane/metadata/android/screenshots",
    locales: ["ru-RU", "en-US", "de-DE"],
    devices: ["pixel_6", "pixel_tablet"],
    use_tests_external_storage: true
  )
end

输出文件的结构

Screengrab 创建文件夹层次结构:语言 → 设备 → 截图。该结构完全符合 Google Play Console 和 App Store Connect 的要求。App Store 要求每种设备类型有严格定义的尺寸,Screengrab 完全按照规格生成图片。

多设备支持

该工具可以在所有连接的设备和模拟器上并行运行测试。Android 模拟器 如果未激活则会自动启动。对于 iOS,Screengrab 使用 Xcode 模拟器。

Screengrab 的安装和配置(Android)

Screengrab 的安装包括两部分:将库添加到项目中和配置文件配置。在 Android 上需要 UI 框架 Espresso 和来自 Fastlane 仓库的 screengrab-lib 库。

添加依赖

在应用模块的 build.gradle 中添加 screengrab-lib 依赖。该库提供 ScreenCapturer 类,用于在调用时截取屏幕截图。

groovy
// build.gradle(模块:app)
androidTestImplementation(
  'tools.fastlane:screengrab-lib:2.1.0'
)

编写带截图的测试

UI 测试在需要的点用 Screengrab.screenshot() 注释标记。每次调用都会截取当前屏幕的截图并以指定的名称保存。

kotlin
import tools.fastlane.screengrab.Screengrab
import tools.fastlane.screengrab.locale.LocaleTestRule

class ScreenshotTest {

    @get:Rule
    val localeTestRule = LocaleTestRule()

    @Test
    fun testTakeScreenshots() {
        Screengrab.screenshot("main_screen")
        // 操作:点击登录按钮
        Screengrab.screenshot("login_screen")
    }
}

Screengrabfile 配置

Screengrabfile 文件存储运行参数:设备列表、语言、超时时间和保存路径。该文件通常位于 fastlane 文件夹中,与 Fastfile 相邻。

截图本地化和多语言

本地化 — Screengrab 的关键功能,也是它最常被选择的原因。该工具会在每次测试运行前自动切换应用程序的语言,并在所有指定的语言中拍摄截图。

语言设置

语言在 Screengrabfile 中用 locales 参数指定。对于每种语言,Screengrab 会使用相应的资源重新安装应用并运行完整的测试周期。Android 上的 LocaleTestRule 会自动切换设备的区域设置。

ruby
# Screengrabfile
locales [
  "ru-RU",
  "en-US",
  "de-DE",
  "fr-FR",
  "es-ES",
  "ja-JP",
  "ko-KR"
]

本地化截图的文件夹结构

Screengrab 按照以下模式创建目录:screenshots/{locale}/{device_name}/{screenshot_name}.png。此结构直接符合 Google Play 的要求,可以通过 Fastlane deliver 一个命令上传截图。

对于 iOS,App Store Connect 期望截图呈现按语言的扁平结构。Fastlane 会在发布时自动将 Screengrab 的层次结构转换为所需格式。

将 Screengrab 集成到 CI/CD 流水线中

CI/CD 集成是 Screengrab 的主要优势之一。该工具从命令行运行,不需要图形界面,使其成为服务器构建的理想选择。

GitHub Actions

在 CI 环境中,需要启动 Android 模拟器或 iOS 模拟器,然后调用带截图的 lane。GitHub Actions 支持 AVD 缓存,这可以加速重复运行。

CI 参数

在 CI 配置中,重要的是考虑内存和时间限制。Android 模拟器 每台设备至少需要 2 GB 内存,在 7 种语言和 2 台设备上完整运行需要 20–40 分钟。

ruby
# Fastfile — 带超时的 CI lane
lane :ci_screenshots do
  capture_android_screenshots(
    locales: ["en-US", "ru-RU"],
    devices: ["pixel_6"],
    clear_previous_screenshots: true,
    tests_timeout: "600",
    output_directory: "screenshots/ci"
  )
end

Jenkins Pipeline

对于 Jenkins,使用 sh 步骤调用 bundle exec fastlane。建议在夜间或在合并到主分支后触发运行截图,以免拖慢开发周期。

Screengrab vs 替代方案:工具对比

Screengrab — 不是唯一的截图自动化工具。存在不同方法的替代方案:操作系统内置工具、商业平台和代码中的截图库。

工具平台本地化CI/CD
ScreengrabAndroid, iOS自动原生
ADB ShellAndroid手动通过脚本
XCTestiOS手动通过 xcodebuild
Firebase Test LabAndroid需要配置
Appium跨平台手动通过 WebDriver

ADB Shell 提供完全控制,但需要为每个场景编写脚本。XCTest 内置于 Xcode,但不能自动管理本地化。Firebase Test Lab 在云端真实设备上运行测试,提供最大覆盖率,但需要按分钟付费。

Screengrab 凭借其组合胜出:Fastlane 管理构建的整个生命周期 — 从编译到发布。Google Play 直接通过 Fastlane deliver 接受 Screengrab 的文件夹结构。

常见问题及解决方案

在使用 Screengrab 时,开发者最常遇到几个重复出现的问题。了解常见错误可以缩短首次运行时的调试时间。

截图为空或黑色

问题出现在 Screengrab 在屏幕渲染完成之前拍摄截图时。解决方法 — 在调用 screenshot() 之前添加 Thread.sleep() 延迟,或使用 Espresso 的 IdlingResource 等待异步操作。

版本不兼容错误

screengrab-lib 库必须与 Fastlane 的版本匹配。Fastlane 每月更新一次,旧库可能不支持新的配置参数。解决方法 — 通过 Gemfile 和 gradle.properties 同步版本。

CI 中运行时间过长

在 5 台设备上以 30 种语言运行可能超过一小时。解决方法 — 拆分运行:一个为商店运行所有语言,另一个为内部需求运行两种语言。GitHub Actions 允许使用策略矩阵进行并行运行。

CI 中的模拟器问题

Android 模拟器需要硬件虚拟化,这在 CI 服务器上并不总是可用。KVM 必须启用,否则模拟器无法启动。解决方法 — 使用没有 GPU 加速的 x86 镜像或 Firebase Test Lab。

常见问题解答

Screengrab 与通过 ADB 的普通截图有何不同?

ADB 拍摄当前屏幕上显示的内容的截图。Screengrab 与 UI 测试集成,自动切换语言和设备,并按照场景自动拍摄一系列截图,无需人工参与。

可以不用 Fastlane 使用 Screengrab 吗?

不能,Screengrab 是 Fastlane 生态系统的组成部分,使用其基础设施进行编译、安装和协调。screengrab-lib 库不能单独运行 — 需要 Fastlane 作为编排器。

在 10 种语言上生成截图需要多长时间?

在一台设备上,10 种语言的运行需要 15–25 分钟。每种语言都需要重新安装应用程序和完整的 UI 测试周期。在多个设备上并行运行可按比例减少时间。

Screengrab 支持 iOS 应用吗?

支持,Screengrab 通过 XCTest 和 Xcode 模拟器支持 iOS。配置与 Android 类似:添加语言和设备,Swift 中的 UI 测试使用 XCTest 编写,通过 XCUIScreenshot 进行截图。

如何只针对新语言更新截图?

Screengrab 不支持增量模式 — 每次运行都会生成完整的截图集。建议为 CI 设置一个独立的 lane,使用有限的语言列表,以避免覆盖主运行中的现有截图。

总结

  • Screengrab — 用于自动化 Android 和 iOS 移动应用截图的 Fastlane 组件。
  • 自动化 用一个终端命令取代了手动创建数百张截图的工作。
  • 本地化 — 该工具在每次测试运行前自动切换应用程序的语言。
  • CI/CD — 与 Jenkins、GitHub Actions、GitLab CI 和其他无图形界面的流水线集成。
  • 结构 输出文件符合 Google Play 和 App Store 直接上传的要求。
  • 灵活性 — 支持多台设备、屏幕方向和自定义测试场景。
  • 节省 — 每次更新时 15 分钟内生成一百张截图,而不是几小时的手动工作。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读