Screengrab è un’utilità dell’ecosistema Fastlane per automatizzare la creazione di screenshot di app mobili per Android e iOS. Invece di scorrere manualmente gli schermi su decine di dispositivi, lo sviluppatore esegue un singolo comando e Screengrab cattura autonomamente tutti gli schermi necessari. Secondo Fastlane Docs, 2026, lo strumento supporta simultaneamente fino a 30 lingue e qualsiasi risoluzione dello schermo specificata nella configurazione.
Punti chiave
Screengrab è un componente dell’ecosistema Fastlane progettato per la creazione automatizzata di screenshot di app mobili. Lo strumento è apparso nel 2015 come risposta al problema: per pubblicare su Google Play e App Store sono necessari da 4 a 10 screenshot per lingua. Con il supporto di 30 lingue, si tratta di 120–300 catture manuali.
Uno sviluppatore avvia manualmente l’app su un simulatore o dispositivo, scorre fino allo schermo desiderato, fa uno screenshot, lo trasferisce al computer, lo ritaglia e lo salva nella cartella corretta. La procedura si ripete per ogni lingua e ogni orientamento. Secondo Google Play Console, l’app media viene aggiornata ogni due settimane, trasformando gli screenshot in una routine regolare.
Screengrab risolve il problema radicalmente: lo sviluppatore descrive scenari di test utilizzando un framework UI (Espresso per Android, XCTest per iOS) e Screengrab li esegue automaticamente su tutti i dispositivi e lingue necessari. Fastlane coordina il processo: compila l’app, esegue i test, raccoglie gli screenshot e li impacchetta nella struttura di cartelle richiesta.
Il risultato — cento screenshot in 10–15 minuti invece di diverse ore di lavoro manuale. Google raccomanda di aggiornare gli screenshot a ogni modifica significativa dell’interfaccia e, senza automazione, questo consiglio viene spesso ignorato.
L’architettura di Screengrab è costruita attorno a due componenti chiave: un client sul dispositivo (screengrab-lib) e un esecutore che gestisce l’esecuzione dei test e la raccolta dei risultati. Su Android utilizza il framework di test strumentato; su iOS — XCTest.
Fastlane chiama l’azione screengrab, che legge il file di configurazione Screengrabfile. L’esecutore compila l’APK di test con la libreria screengrab-lib collegata, lo installa sui dispositivi o emulatori connessi ed esegue i test UI contrassegnati con annotazioni per gli screenshot.
# Fastfile — descrizione della lane per screenshot
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 crea una gerarchia di cartelle: lingua → dispositivo → screenshot. La struttura corrisponde completamente ai requisiti di Google Play Console e App Store Connect. L’App Store richiede dimensioni rigorosamente definite per ogni tipo di dispositivo e Screengrab genera catture esattamente secondo le specifiche.
Lo strumento può eseguire test in parallelo su tutti i dispositivi ed emulatori connessi. Gli emulatori Android si avviano automaticamente se non sono attivi. Per iOS, Screengrab utilizza i simulatori Xcode.
L’installazione di Screengrab consiste in due parti: aggiunta della libreria al progetto e configurazione del file di configurazione. Su Android sono necessari il framework UI Espresso e la libreria screengrab-lib dal repository Fastlane.
Nel build.gradle del modulo dell’app, viene aggiunta la dipendenza screengrab-lib. La libreria fornisce la classe ScreenCapturer, che effettua uno screenshot al momento della chiamata.
// build.gradle (module: app)
androidTestImplementation(
'tools.fastlane:screengrab-lib:2.1.0'
)
Un test UI viene contrassegnato con l’annotazione Screengrab.screenshot() nei punti necessari. Ogni chiamata cattura lo schermo corrente e lo salva con il nome specificato.
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")
// Azioni: toccare il pulsante di login
Screengrab.screenshot("login_screen")
}
}
Il file Screengrabfile memorizza i parametri di avvio: elenco dispositivi, lingue, timeout e percorso di salvataggio. Il file si trova solitamente nella cartella fastlane accanto a Fastfile.
La localizzazione è la funzionalità chiave di Screengrab e la ragione principale per cui viene scelto più spesso. Lo strumento cambia automaticamente la lingua dell’app prima di ogni esecuzione di test e scatta screenshot in tutte le lingue specificate.
Le lingue vengono impostate in Screengrabfile utilizzando il parametro locales. Per ogni lingua, Screengrab reinstalla l’app con le risorse corrispondenti ed esegue l’intero ciclo di test. LocaleTestRule su Android cambia automaticamente la locale del dispositivo.
# Screengrabfile
locales [
"ru-RU",
"en-US",
"de-DE",
"fr-FR",
"es-ES",
"ja-JP",
"ko-KR"
]
Screengrab crea directory secondo lo schema: screenshots/{locale}/{device_name}/{screenshot_name}.png. Questa struttura corrisponde direttamente ai requisiti di Google Play, consentendo il caricamento degli screenshot tramite Fastlane deliver con un singolo comando.
Per iOS, App Store Connect prevede screenshot in una struttura piatta per lingua. Fastlane converte automaticamente la gerarchia di Screengrab nel formato richiesto durante la pubblicazione.
L’integrazione CI/CD è uno dei principali vantaggi di Screengrab. Lo strumento viene eseguito dalla riga di comando e non richiede interfaccia grafica, rendendolo ideale per le build su server.
In un ambiente CI, è necessario avviare un emulatore Android o simulatore iOS, quindi chiamare la lane con gli screenshot. GitHub Actions supporta la memorizzazione nella cache AVD, accelerando le esecuzioni ripetute.
Nella configurazione CI, è importante considerare i limiti di memoria e tempo. Gli emulatori Android richiedono almeno 2 GB di RAM per dispositivo e un’esecuzione completa su 7 lingue e 2 dispositivi richiede 20–40 minuti.
# Fastfile — lane per CI con timeout
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
Per Jenkins, viene utilizzato il passo sh con una chiamata a bundle exec fastlane. Si consiglia di eseguire gli screenshot di notte o tramite trigger dopo il merge nel ramo principale per non rallentare il ciclo di sviluppo.
Screengrab non è l’unico strumento per automatizzare gli screenshot. Esistono alternative con approcci diversi: strumenti integrati del sistema operativo, piattaforme commerciali e librerie di screenshot nel codice.
| Strumento | Piattaforma | Localizzazione | CI/CD |
|---|---|---|---|
| Screengrab | Android, iOS | Automatica | Nativa |
| ADB Shell | Android | Manuale | Tramite script |
| XCTest | iOS | Manuale | Tramite xcodebuild |
| Firebase Test Lab | Android | Richiede configurazione | Sì |
| Appium | Multipiattaforma | Manuale | Tramite WebDriver |
ADB Shell offre il controllo totale ma richiede la scrittura di script per ogni scenario. XCTest è integrato in Xcode ma non gestisce automaticamente la localizzazione. Firebase Test Lab esegue test su dispositivi reali nel cloud, offrendo la massima copertura, ma addebita un costo al minuto.
Screengrab vince per la combinazione: Fastlane gestisce l’intero ciclo di vita della build — dalla compilazione alla pubblicazione. Google Play accetta direttamente la struttura di cartelle di Screengrab tramite Fastlane deliver.
Quando si lavora con Screengrab, gli sviluppatori incontrano spesso diversi problemi ricorrenti. Conoscere gli errori tipici riduce il tempo di debug al primo avvio.
Il problema si verifica quando Screengrab scatta uno screenshot prima del completamento del rendering dello schermo. La soluzione è aggiungere un ritardo Thread.sleep() prima di chiamare screenshot() o utilizzare IdlingResource di Espresso per attendere operazioni asincrone.
La versione di screengrab-lib deve corrispondere alla versione di Fastlane. Fastlane viene aggiornato mensilmente e una vecchia libreria potrebbe non supportare nuovi parametri di configurazione. La soluzione è sincronizzare le versioni tramite Gemfile e gradle.properties.
Eseguire su 30 lingue su 5 dispositivi può richiedere più di un’ora. La soluzione è dividere le esecuzioni: una per lo store in tutte le lingue, un’altra per esigenze interne in due lingue. GitHub Actions consente di utilizzare strategie a matrice per esecuzioni parallele.
L’emulatore Android richiede la virtualizzazione hardware, che non è sempre disponibile sui server CI. KVM deve essere abilitato, altrimenti l’emulatore non si avvia. La soluzione è utilizzare immagini x86 senza accelerazione GPU o Firebase Test Lab.
Domande frequenti
ADB cattura ciò che viene visualizzato sullo schermo in quel momento. Screengrab si integra con i test UI, cambia automaticamente lingue e dispositivi e scatta una serie di screenshot secondo uno scenario senza intervento umano.
No, Screengrab è un componente dell’ecosistema Fastlane e utilizza la sua infrastruttura per compilare, installare e coordinare. La libreria screengrab-lib non può essere eseguita separatamente — Fastlane è necessario come orchestratore.
Su un singolo dispositivo, un’esecuzione in 10 lingue richiede 15–25 minuti. Ogni lingua richiede la reinstallazione dell’app e un ciclo completo di test UI. L’esecuzione parallela su più dispositivi riduce il tempo proporzionalmente.
Sì, Screengrab supporta iOS tramite XCTest e simulatori Xcode. La configurazione è simile ad Android: si aggiungono lingue e dispositivi e i test UI in Swift vengono scritti utilizzando XCTest con catture tramite XCUIScreenshot.
Screengrab non supporta la modalità incrementale — ogni esecuzione genera un set completo di screenshot. Si consiglia di impostare una lane separata per CI con un elenco limitato di lingue per evitare di sovrascrivere le catture esistenti dall’esecuzione principale.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche