Segunda corrección específica para el Samsung Galaxy A06 en dos días. La versión 1.0.10, publicada ayer, corregía un cierre inesperado al inicio en este dispositivo; 1.0.10 llevaba instalada solo unas horas cuando surgió un problema nuevo y distinto a través de Google Play Console — esta vez un ANR (app congelada unos segundos). El informe detallado permitió una corrección rápida, y esta versión también resuelve un fallo visual del efecto neón de los iconos en el cajón.

1.0.11 — ANR al inicio en Samsung Galaxy A06

El síntoma

En el Samsung Galaxy A06 (Android 16), al primer inicio de Sola tras la instalación, la app se congelaba durante 5 a 6 segundos antes de que Android mostrara el cuadro de diálogo «Sola no responde — Esperar / Cerrar app». A diferencia del cierre inesperado de la 1.0.10, la app no se cerraba de golpe: simplemente quedaba inutilizable durante varios segundos.

Técnicamente, el informe de Play Console indicaba un ANR de tipo "Input dispatching timed out" — Android vigila que el hilo principal procese los eventos de entrada (toque, deslizamiento) en menos de 5 segundos. Pasado ese tiempo, el sistema considera la app bloqueada y le ofrece al usuario cerrarla.

La causa

El Samsung Galaxy A06 tiene un procesador de gama de entrada (Unisoc T606, cuatro núcleos a 1.6 GHz) y una GPU modesta. Es varias veces más lento que los dispositivos en los que Sola suele probarse (Pixel 8 Pro, Pixel Tablet).

Al iniciar la pantalla de inicio, Sola carga en una sola pasada todos los iconos de las apps presentes en la cuadrícula (normalmente entre 15 y 25 apps, más las guardadas en carpetas). Cada icono pasa por PackageManager.getApplicationIcon(), un método de Android que abre el APK objetivo, lee la definición XML del icono adaptativo y luego decodifica dos imágenes bitmap (la capa de primer plano y el fondo).

En el Pixel 8 Pro, cada decodificación tarda unos diez milisegundos — 20 iconos se muestran en menos de 300 ms, algo totalmente imperceptible. En el A06, la misma decodificación tarda entre 200 y 500 milisegundos por icono. 20 iconos × 300 ms = 6 segundos de bloqueo. Y esta carga se realizaba en el hilo principal (el que procesa los toques del usuario), lo que desencadenaba el ANR.

La corrección

El flujo que alimenta la cuadrícula de inicio ahora está confinado al pool de hilos de entrada/salida mediante flowOn(Dispatchers.IO). En concreto, toda la decodificación de iconos se ejecuta ahora en hilos dedicados en paralelo. Solo la lista final (una vez decodificados los 20 iconos) llega al hilo principal para mostrarse. El hilo principal permanece siempre receptivo, incluso durante una carga pesada.

La misma corrección se aplicó al flujo que lista las carpetas con sus apps, que sufría el mismo problema.

Verificado en un emulador que reproduce las especificaciones del Galaxy A06 (720×1600, 260 dpi, Android 16, GPU por software para simular la lentitud): la pantalla de inicio aparece al instante, sin ningún ANR.

Efecto neón de los iconos ausente en el cajón

El síntoma

Al seleccionar un pack de iconos integrado (Pixelarticons, Lucide, Game-Icons…) con la opción «efecto neón» activada, los iconos mostraban correctamente un halo luminoso en la pantalla de inicio, en las carpetas y en el dock. Pero en el cajón de aplicaciones, el halo desaparecía: los iconos se mostraban en su color plano, sin el efecto neón.

La causa

El efecto neón se implementa mediante un drawable-wrapper que envuelve el icono original para añadirle el halo en el momento del renderizado. Dos rutas de código distintas cargan los iconos de las apps: una para la pantalla de inicio y las carpetas, y otra para el cajón (que lista todas las apps instaladas de una vez).

La ruta usada por la pantalla de inicio ya tenía una excepción específica para preservar este wrapper. La ruta usada por el cajón no tenía esa excepción: llamaba sistemáticamente a constantState.newDrawable() para crear una instancia nueva del drawable, lo que tiene el efecto secundario de desenvolver el wrapper neón y conservar solo el icono plano de debajo.

La corrección

La excepción NeonDrawable se ha trasladado a la ruta del cajón: cuando el icono cargado es un wrapper neón, ahora se conserva tal cual en lugar de clonarse. El efecto halo ahora se preserva en el cajón igual que en cualquier otro lugar.

Se añadieron tres pruebas unitarias para blindar ambas rutas (inicio y cajón), además del comportamiento inverso (los drawables normales deben seguir clonándose para evitar efectos secundarios al cambiar de pack). Una futura regresión de este tipo se detectará antes de llegar a producción.

Cómo obtener la actualización

La 1.0.11 se está desplegando progresivamente a través de Play Store (empezando por el 20 % de los usuarios, con una subida gradual hasta el 100 % en 24 a 48 horas). Debería estar disponible para todos en dos días. También se puede forzar la comprobación desde la app de Play Store, en la sección «Gestionar apps y dispositivo».

Abrir en Google Play