ViewCapture è uno strumento software che acquisisce le proprietà delle visualizzazioni (ad esempio 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à, in modo da conoscere lo stato dell'esperienza utente in momenti specifici e 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 della CPU significative e possono influire sulle prestazioni. Lo strumento ViewCapture ha un impatto sulle risorse inferiore e può essere attivato più di frequente. Inoltre, ViewCapture mostra le visualizzazioni frame per frame a livello di visualizzazione, semplificando 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 ridisegnare del frame attiva un
percorso 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 le prestazioni. L'implementazione di ViewCapture
ottimizza questo processo controllando se una visualizzazione è non aggiornata o non valida utilizzando captureViewTree
,
evitando così di esaminare l'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
Le sezioni seguenti descrivono le limitazioni di prestazioni e memoria nell'esecuzione di ViewCapture.
Prestazioni
Il sovraccarico medio del thread principale per il rendimento di ViewCapture è
195 μs. Tuttavia, nei casi peggiori, possono essere necessari circa 5 ms. Fai riferimento al segmento vc#onDraw
nel tracciato Perfetto.
I costi generali sono dovuti principalmente alle seguenti azioni:
- L'esplorazione della gerarchia costa 50 μs, anche se viene eliminata.
- L'estrazione di oggetti da un allocatore della lista libera per memorizzare copie delle proprietà della visualizzazione costa 20 μs.
- Il recupero di ciascun valore della proprietà tramite una funzione di accessoro comporta molte chiamate di funzioni aggiuntive per visualizzazione, con un costo di 110 μs.
Di conseguenza, l'attivazione di ViewCapture nel monitoraggio sempre attivo (AOT) influisce negativamente sulle prestazioni del sistema e causa arresti anomali. A causa di queste limitazioni di prestazioni e memoria, questo approccio non è pronto per l'AOT. Consigliamo di utilizzare ViewCapture solo per il lab e per il debugging locale.
Memoria
Il metodo di Perfetto per le tracce ViewCapture utilizza un singolo anello buffer, che ha un'impronta di memoria predefinita per evitare un utilizzo eccessivo della memoria. Questo approccio impedisce un consumo eccessivo di memoria evitando di utilizzare buffer ad anello separati per ogni finestra, ma non risolve il problema della memorizzazione dell'intera gerarchia di visualizzazione per ogni stato in Perfetto per ogni frame. La registrazione di una singola finestra, ad esempio NexusLauncher, può produrre più di 30 secondi di dati di ViewCapture in un buffer di 10 MB. Tuttavia, l'acquisizione di più di 30 finestre dall'interfaccia utente di sistema richiede un buffer più grande o un intervallo di tempo di registrazione notevolmente più breve.
Istruzioni
Segui queste istruzioni per integrare ViewCapture nelle app di sistema:
Aggiungi la dipendenza al file
Android.bp
, come mostrato nel codice del programma 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 nei seguenti esempi: