Per offrire un'esperienza app fluida, stabile ed efficiente in termini di batteria, è necessario identificare e risolvere i colli di bottiglia comuni delle prestazioni in termini di stabilità, rendering dell'interfaccia utente, consumo di memoria, lavoro in background, latenza di avvio e ottimizzazione della build.
Le guide in questa sezione spiegano il comportamento della piattaforma Android sottostante per ogni tipo di problema e descrivono come diagnosticarli, profilarli e risolverli utilizzando strumenti come Android Studio Profiler, Perfetto, Logcat e ApplicationExitInfo.
Stabilità
- ANR: diagnostica e correzione degli errori di tipo L'applicazione non risponde (ANR) causati da thread dell'interfaccia utente bloccati, I/O del thread principale, contesa di blocchi o ricevitori di trasmissione lenti.
- Arresti anomali: leggi le analisi dello stack, esamina l'output di Logcat e previeni eccezioni non gestite e segnali nativi.
Rendering e avvio
- Rendering lento: identifica e correggi i frame dell'interfaccia utente eliminati
o bloccati (
>16mse>700ms) causati da layout costosi, passaggi di binding o blocchi del thread principale. - Sessioni lente (solo giochi):
Misura la spaziatura dei frame con
SurfaceFlingere ottimizza le frequenze frame dei giochi utilizzando Android Frame Pacing (Swappy), Vulkan e Android Dynamic Performance Framework (ADPF). - Tempi di avvio dell'app: comprendi i dettagli interni dell'avvio a freddo, caldo e caldo, misura il tempo di attesa per la prima schermata (TTID) e il tempo di attesa per la schermata completa (TTFD) e ottimizza il lavoro di avvio.
Gestione della memoria
- Low Memory Killers (LMK): scopri come il daemon Low Memory Killer (
lmkd) di Android assegna la priorità ai processi tramiteoom_adj_scoree profila il footprint della memoria in Android Studio, Unity e Unreal Engine. - Memoria utilizzata (RSS anonimo + swap): Misura e riduci l'impronta della memoria RSS (Resident Set Size) anonima e swap della tua app negli stati in primo piano, di servizio e in background.
- Memoria utilizzata dalle bitmap: Diagnostica le allocazioni di bitmap sovradimensionate o con perdite e rilascia i buffer grafici quando i componenti dell'interfaccia utente passano in background.
Batteria e attività in background
- Wakelock eccessivi: evita di
mantenere wakelock parziali per periodi prolungati e migra le attività in background
su
WorkManageroJobScheduler. - Wakelock parziali bloccati: assicurati che ogni wakelock parziale acquisito venga rilasciato correttamente in tutti i percorsi di esecuzione e di errore.
- Wakeup eccessivi: riduce i wakeup esatti della sveglia e raggruppa o posticipa il lavoro in background pianificato.
- Ricerche di reti Wi-Fi eccessive in background: riduci la frequenza di ricerca di reti Wi-Fi in background e utilizza API di connettività e posizione passive o batch.
- Utilizzo eccessivo della rete in background:
trasferisci in batch e posticipa i trasferimenti della rete mobile in background utilizzando i vincoli
WorkManager. - Utilizzo eccessivo della batteria: Diagnostica l'elevato consumo della batteria sui dispositivi mobili e Wear OS profilando l'attività di CPU, sensore e radio.
Autorizzazioni e ottimizzazione della build
- Negazione delle autorizzazioni: richiedi le autorizzazioni di runtime nel contesto e spiega chiaramente agli utenti la logica delle autorizzazioni.
- Ottimizzazione del codice DEX: Configura le regole di riduzione, offuscamento e ottimizzazione di R8 per ridurre le dimensioni del file DEX e migliorare le prestazioni di runtime.