ViewCapture è uno strumento software che acquisisce le proprietà delle viste (come posizione, dimensioni, scala e visibilità) associate alle finestre a cui è collegato. ViewCapture acquisisce informazioni sulle varie visualizzazioni all'interno di una finestra e sulle relative proprietà, consentendoti di conoscere lo stato dell'esperienza utente in momenti specifici nel tempo e di monitorare le modifiche nel tempo.
Le registrazioni dello schermo possono visualizzare lo stato di una visualizzazione in un momento specifico e mostrare come cambia, ma richiedono risorse CPU significative e possono influire sulle prestazioni. Lo strumento ViewCapture ha un impatto minore sulle risorse e può essere attivato più spesso. Inoltre, ViewCapture mostra le visualizzazioni fotogramma per fotogramma a livello di visualizzazione, rendendo più semplice l'ispezione dello stato della visualizzazione in momenti specifici rispetto alle registrazioni dello schermo.
Questa pagina descrive come eseguire l'onboarding di ViewCapture nelle app di sistema.
Usa
ViewCapture.java implementa un'istanza di onDrawListener e raccoglie una traccia ViewCapture durante il processo di disegno. Ogni ridisegno del frame attiva un
attraversamento della gerarchia dell'albero delle visualizzazioni a partire dalla visualizzazione principale della finestra.
ViewCapture utilizza metodi getter pubblici View.java per recuperare e copiare i valori in un thread in background per migliorare il rendimento. L'implementazione di ViewCapture
ottimizza questo processo controllando se una visualizzazione è sporca o invalidata utilizzando captureViewTree,
evitando così l'attraversamento dell'intera gerarchia delle visualizzazioni. captureViewTree è
disponibile solo per le app di sistema e fa parte dell'API UnsupportedAppUsage.
L'utilizzo di questa API è limitato alle app in base alla versione dell'SDK di destinazione.
Limitazioni
Questa sezione descrive le limitazioni di prestazioni e memoria di ViewCapture.
Prestazioni
L'overhead medio del thread principale per le prestazioni di ViewCapture è
195 μs. Tuttavia, negli scenari peggiori, possono essere necessari
circa 5 ms. Fai riferimento alla sezione vc#onDraw nella traccia
Perfetto.
I costi generali sono dovuti principalmente alle seguenti azioni:
- L'attraversamento della gerarchia costa 50 μs, anche quando viene eliminata.
- Il recupero di oggetti da un allocatore di elenchi senza costi per archiviare copie delle proprietà di visualizzazione costa 20 μs.
- Il recupero di ogni valore della proprietà tramite una funzione getter comporta molte chiamate di funzioni aggiuntive per visualizzazione, con un costo di 110 μs.
Pertanto, l'attivazione di ViewCapture in always on-tracing (AOT) influisce negativamente sulle prestazioni del sistema e causa jank. A causa di queste limitazioni di prestazioni e memoria, questo approccio non è pronto per AOT. Ti consigliamo di utilizzare ViewCapture solo per il debug locale e dei lab.
Memoria
Il metodo di Perfetto per le tracce ViewCapture utilizza un singolo buffer circolare con un'impronta di memoria predefinita per evitare un utilizzo eccessivo della memoria. Questo approccio impedisce un consumo eccessivo di memoria evitando buffer circolari separati per ogni finestra. Tuttavia, non risolve il problema di memorizzazione dell'intera gerarchia delle visualizzazioni per ogni stato in Perfetto per ogni frame. La registrazione di una singola finestra, ad esempio NexusLauncher, può produrre oltre 30 secondi di dati ViewCapture in un buffer di 10 MB. L'acquisizione di oltre 30 finestre dall'interfaccia utente di sistema richiede un buffer più grande o un tempo di registrazione notevolmente più breve.
Istruzioni
Per eseguire l'onboarding di ViewCapture nelle app di sistema:
- Aggiungi la dipendenza al file - Android.bp, come mostrato nel codice di avvio.- android_library { name: "YourLib", static_libs: [ ... "//frameworks/libs/systemui:view_capture", ... ], platform_apis: true, privileged: true, }
- Crea un'istanza ViewCapture quando crei la finestra, ad esempio: - 
private SafeCloseable mViewCapture; @Override protected void onCreate(Bundle savedInstanceState) { ... mViewCapture = ViewCaptureFactory.getInstance(this).startCapture(getWindow()); }
- 
private SafeCloseable mViewCapture; @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); if (enableViewCaptureTracing()) { mViewCaptureCloseable = ViewCaptureFactory.getInstance(getContext()) .startCapture(getRootView(), ".NotificationShadeWindowView"); } ... }
 
- 
- Chiudi l'istanza ViewCapture quando distruggi la finestra, come mostrato negli esempi seguenti: 
