Seconda correzione mirata per il Samsung Galaxy A06 in due giorni. La versione 1.0.10, pubblicata ieri, correggeva un crash all'avvio su questo dispositivo; la 1.0.10 era installata da poche ore quando un nuovo problema, diverso, è emerso tramite Google Play Console — questa volta un ANR (app bloccata per alcuni secondi). Il report dettagliato ha permesso una correzione rapida, e questa versione risolve anche un difetto visivo dell'effetto neon delle icone nel drawer.
1.0.11 — ANR all'avvio su Samsung Galaxy A06
Il sintomo
Su Samsung Galaxy A06 (Android 16), al primo avvio di Sola dopo l'installazione, l'app si bloccava per 5-6 secondi prima che Android mostrasse la finestra di dialogo «Sola non risponde — Attendi / Chiudi app». A differenza del crash della 1.0.10, l'app non si chiudeva bruscamente: restava semplicemente inutilizzabile per diversi secondi.
Tecnicamente, la traccia segnalata da Play Console indicava un ANR di tipo "Input dispatching timed out" — Android verifica che il thread principale elabori gli eventi di input (tap, swipe) entro 5 secondi. Oltre questo limite, il sistema considera l'app bloccata e propone all'utente di chiuderla.
La causa
Il Samsung Galaxy A06 è dotato di un processore entry-level (Unisoc T606, quattro core a 1,6 GHz) e di una GPU modesta. È diverse volte più lento dei dispositivi su cui Sola viene solitamente testato (Pixel 8 Pro, Pixel Tablet).
All'avvio della home, Sola carica in un'unica passata tutte le icone delle app presenti nella griglia (tipicamente 15-25 app, più quelle contenute nelle cartelle). Ogni icona passa attraverso PackageManager.getApplicationIcon(), un metodo Android che apre l'APK di destinazione, legge la definizione XML dell'icona adattiva, quindi decodifica due immagini bitmap (il livello di primo piano e lo sfondo).
Su Pixel 8 Pro, ogni decodifica richiede una decina di millisecondi — 20 icone vengono visualizzate in meno di 300 ms, del tutto impercettibile. Sull'A06, la stessa decodifica richiede tra 200 e 500 millisecondi per icona. 20 icone × 300 ms = 6 secondi di blocco. Ora, questo caricamento avveniva sul thread principale (quello che elabora i tap dell'utente), il che scatenava l'ANR.
La correzione
Il flusso che alimenta la griglia della home è ora confinato al pool di thread di input/output tramite flowOn(Dispatchers.IO). In pratica, tutta la decodifica delle icone viene ora eseguita su thread dedicati in parallelo. Solo l'elenco finale (una volta decodificate tutte le 20 icone) arriva al thread principale per essere visualizzato. Il thread principale resta sempre reattivo, anche durante un caricamento pesante.
La stessa correzione è stata applicata al flusso che elenca le cartelle con le relative app, che soffriva dello stesso problema.
Verificato su un emulatore che riproduce le specifiche del Galaxy A06 (720×1600, 260 dpi, Android 16, GPU software per simulare la lentezza): la home appare istantaneamente, nessun ANR viene attivato.
Effetto neon delle icone assente nel drawer
Il sintomo
Selezionando un pack di icone integrato (Pixelarticons, Lucide, Game-Icons…) con l'opzione «effetto neon» attivata, le icone mostravano correttamente un alone luminoso sulla home, nelle cartelle e nel dock. Ma nel drawer delle applicazioni, l'alone scompariva: le icone apparivano nel loro colore piatto, senza l'effetto neon.
La causa
L'effetto neon è implementato tramite un drawable-wrapper che avvolge l'icona originale per aggiungere l'alone al momento del rendering. Due percorsi di codice diversi caricano le icone delle app: uno per la home e le cartelle, un altro per il drawer (che elenca tutte le app installate in una volta).
Il percorso usato dalla home prevedeva già un'eccezione specifica per preservare questo wrapper. Il percorso usato dal drawer non aveva questa eccezione: chiamava sistematicamente constantState.newDrawable() per creare una nuova istanza del drawable, il che ha come effetto collaterale quello di rimuovere il wrapper neon, conservando solo l'icona piatta sottostante.
La correzione
L'eccezione NeonDrawable è stata portata sul percorso del drawer: quando l'icona caricata è un wrapper neon, viene ora mantenuta così com'è invece di essere clonata. L'effetto alone è ora preservato nel drawer come ovunque altrove.
Sono stati aggiunti tre test unitari per bloccare entrambi i percorsi (home e drawer) oltre al comportamento inverso (i drawable classici devono comunque essere clonati per evitare effetti collaterali al cambio di pack). Una futura regressione di questo tipo verrà ora individuata a monte.
Come ottenere l'aggiornamento
La 1.0.11 viene distribuita progressivamente tramite il Play Store (avvio al 20% degli utenti, poi salita graduale verso il 100% in 24-48 ore). Dovrebbe essere disponibile per tutti entro due giorni. È anche possibile forzare la verifica dall'app Play Store, nella sezione «Gestisci app e dispositivo».
Apri su Google Play