Deuxième correctif ciblé sur le Samsung Galaxy A06 en deux jours. La version 1.0.10 publiée hier corrigeait un plantage au démarrage sur cet appareil ; la 1.0.10 était installée depuis quelques heures qu'un nouveau problème, différent, remontait via Google Play Console — cette fois un ANR (application figée quelques secondes). Le rapport détaillé a permis un fix rapide, et cette version règle aussi un défaut d'affichage de l'effet néon des icônes dans le tiroir.

1.0.11 — ANR au démarrage sur Samsung Galaxy A06

Le symptôme

Sur Samsung Galaxy A06 (Android 16), au premier lancement de Sola après installation, l'application se figeait pendant 5 à 6 secondes avant qu'Android n'affiche la boîte de dialogue « Sola ne répond pas — Attendre / Forcer l'arrêt ». Contrairement au crash de la 1.0.10, l'application ne fermait pas brutalement : elle restait juste inutilisable pendant plusieurs secondes.

Techniquement, la trace remontée par Play Console indiquait un ANR de type « Input dispatching timed out » — Android surveille que le thread principal traite les événements d'entrée (tap, swipe) sous 5 secondes. Au-delà, le système considère l'application comme bloquée et propose à l'utilisateur de la fermer.

La cause

Le Samsung Galaxy A06 est équipé d'un processeur d'entrée de gamme (Unisoc T606, quatre cœurs à 1.6 GHz) et d'un GPU modeste. Il est plusieurs fois plus lent que les appareils sur lesquels Sola est habituellement testé (Pixel 8 Pro, Pixel Tablet).

Au démarrage de la home, Sola charge en une seule passe toutes les icônes des applications présentes sur la grille (typiquement 15 à 25 apps, plus celles rangées dans les dossiers). Chaque icône passe par PackageManager.getApplicationIcon(), une méthode Android qui ouvre l'APK cible, lit la définition XML de l'icône adaptive, puis décode deux images bitmap (le calque de premier plan et l'arrière-plan).

Sur Pixel 8 Pro, chaque décodage prend une dizaine de millisecondes — 20 icônes s'affichent en moins de 300 ms, totalement invisible. Sur A06, le même décodage prend entre 200 et 500 millisecondes par icône. 20 icônes × 300 ms = 6 secondes de blocage. Or ce chargement se faisait sur le thread principal (celui qui traite les taps de l'utilisateur), ce qui déclenchait l'ANR.

Le correctif

Le flux qui alimente la grille d'accueil est désormais confiné au pool de threads d'entrée/sortie via flowOn(Dispatchers.IO). Concrètement, tout le décodage d'icônes s'exécute maintenant sur des threads dédiés en parallèle. Seule la liste finale (une fois les 20 icônes décodées) atterrit sur le thread principal pour être affichée. Le thread principal reste réactif en permanence, même pendant un chargement lourd.

Le même correctif a été appliqué au flux qui liste les dossiers avec leurs applications, qui souffrait du même problème.

Vérifié sur émulateur reproduisant les spécifications du Galaxy A06 (720×1600, 260 dpi, Android 16, GPU logiciel pour simuler la lenteur) : la home s'affiche instantanément, aucun ANR déclenché.

Effet néon des icônes absent dans le tiroir

Le symptôme

Lors de la sélection d'un pack d'icônes intégré (Pixelarticons, Lucide, Game-Icons…) avec l'option « effet néon » activée, les icônes affichaient bien un halo lumineux sur la home, dans les dossiers et dans le dock. Mais dans le tiroir d'applications, le halo disparaissait : les icônes apparaissaient dans leur teinte plate, sans l'effet néon.

La cause

L'effet néon est implémenté via un drawable-wrapper qui enrobe l'icône originale pour lui ajouter le halo au moment du rendu. Deux chemins de code différents chargent les icônes des applications : un pour la home et les dossiers, un autre pour le tiroir (qui liste toutes les applications installées d'un coup).

Le chemin utilisé par la home comportait déjà une exception spécifique pour préserver ce wrapper. Le chemin utilisé par le tiroir n'avait pas cette exception : il appelait systématiquement constantState.newDrawable() pour créer une instance fraîche du drawable, ce qui a pour effet secondaire de déballer le wrapper néon et de ne conserver que l'icône plate en dessous.

Le correctif

L'exception NeonDrawable a été portée sur le chemin tiroir : quand l'icône chargée est un wrapper néon, on la garde telle quelle au lieu de la cloner. L'effet halo est désormais préservé dans le tiroir comme partout ailleurs.

Trois tests unitaires ont été ajoutés pour verrouiller les deux chemins (home et tiroir) plus le comportement inverse (les drawables classiques doivent bien être clonés pour éviter des effets de bord au changement de pack). Une régression future de ce type sera détectée en amont.

Comment obtenir la mise à jour

La 1.0.11 est déployée progressivement via le Play Store (démarrage à 20 % des utilisateurs, puis montée graduelle vers 100 % sur 24 à 48 heures). Elle devrait être disponible pour tout le monde dans les deux jours. Il est aussi possible de forcer la vérification depuis l'application Play Store, section « Gérer les apps et l'appareil ».

Ouvrir sur Google Play