Tweede gerichte patch voor de Samsung Galaxy A06 in twee dagen tijd. Versie 1.0.10, gisteren uitgebracht, verhielp een crash bij het opstarten op dit toestel; 1.0.10 stond nog maar enkele uren geïnstalleerd toen via Google Play Console een nieuw, ander probleem naar boven kwam — dit keer een ANR (app enkele seconden bevroren). Het gedetailleerde rapport maakte een snelle fix mogelijk, en deze versie lost ook een weergavefout op van het neon-effect van icoontjes in de app-lade.

1.0.11 — ANR bij opstarten op Samsung Galaxy A06

Het symptoom

Op de Samsung Galaxy A06 (Android 16) bevroor de app bij de eerste keer opstarten van Sola na installatie 5 tot 6 seconden lang, voordat Android het dialoogvenster "Sola reageert niet — Wachten / Sluiten" toonde. Anders dan bij de crash in 1.0.10 sloot de app niet abrupt af: ze was gewoon enkele seconden onbruikbaar.

Technisch gezien wees het door Play Console gerapporteerde spoor op een ANR van het type "Input dispatching timed out" — Android controleert of de hoofdthread invoergebeurtenissen (tik, swipe) binnen 5 seconden verwerkt. Daarna beschouwt het systeem de app als geblokkeerd en biedt het de gebruiker aan om ze te sluiten.

De oorzaak

De Samsung Galaxy A06 heeft een instapprocessor (Unisoc T606, vier cores op 1,6 GHz) en een bescheiden GPU. Het toestel is meerdere keren trager dan de apparaten waarop Sola gewoonlijk wordt getest (Pixel 8 Pro, Pixel Tablet).

Bij het opstarten van het beginscherm laadt Sola in één keer alle icoontjes van de apps op het raster (doorgaans 15 tot 25 apps, plus die in mappen). Elk icoontje doorloopt PackageManager.getApplicationIcon(), een Android-methode die het doel-APK opent, de XML-definitie van het adaptieve icoontje leest en vervolgens twee bitmapafbeeldingen decodeert (de voorgrondlaag en de achtergrond).

Op de Pixel 8 Pro duurt elke decodering ongeveer tien milliseconden — 20 icoontjes verschijnen in minder dan 300 ms, volledig onzichtbaar voor het oog. Op de A06 duurt diezelfde decodering tussen 200 en 500 milliseconden per icoontje. 20 icoontjes × 300 ms = 6 seconden blokkering. Dit laden gebeurde op de hoofdthread (degene die de tikken van de gebruiker verwerkt), wat de ANR veroorzaakte.

De oplossing

De stroom die het beginscherm-raster voedt, is nu beperkt tot de invoer/uitvoer-threadpool via flowOn(Dispatchers.IO). Concreet draait alle icoondecodering nu parallel op speciale threads. Alleen de uiteindelijke lijst (zodra de 20 icoontjes gedecodeerd zijn) komt op de hoofdthread terecht om weergegeven te worden. De hoofdthread blijft altijd responsief, zelfs tijdens een zware laadbeurt.

Dezelfde oplossing is toegepast op de stroom die mappen met hun apps opsomt, die aan hetzelfde probleem leed.

Getest op een emulator die de specificaties van de Galaxy A06 nabootst (720×1600, 260 dpi, Android 16, software-GPU om de traagheid te simuleren): het beginscherm verschijnt onmiddellijk, geen enkele ANR treedt op.

Neon-effect van icoontjes ontbreekt in de app-lade

Het symptoom

Bij het selecteren van een ingebouwd icoonpakket (Pixelarticons, Lucide, Game-Icons…) met de optie "neon-effect" ingeschakeld, toonden de icoontjes wel degelijk een lichtgevende halo op het beginscherm, in mappen en in het dock. Maar in de app-lade verdween de halo: de icoontjes verschenen in hun platte kleur, zonder het neon-effect.

De oorzaak

Het neon-effect wordt geïmplementeerd via een drawable-wrapper die het originele icoontje omhult om de halo toe te voegen op het moment van weergave. Twee verschillende codepaden laden de app-icoontjes: één voor het beginscherm en de mappen, en één voor de lade (die in één keer alle geïnstalleerde apps opsomt).

Het pad dat door het beginscherm werd gebruikt, had al een specifieke uitzondering om deze wrapper te behouden. Het pad van de lade had die uitzondering niet: het riep systematisch constantState.newDrawable() aan om een nieuwe instantie van de drawable te maken, met als neveneffect dat de neon-wrapper werd uitgepakt en alleen het platte icoontje eronder overbleef.

De oplossing

De NeonDrawable-uitzondering is overgezet naar het ladepad: wanneer het geladen icoontje een neon-wrapper is, wordt het ongewijzigd behouden in plaats van gekloond. Het halo-effect blijft nu behouden in de lade, net als overal elders.

Er zijn drie unit-tests toegevoegd om beide paden (beginscherm en lade) vast te leggen, plus het omgekeerde gedrag (klassieke drawables moeten wel degelijk gekloond worden om neveneffecten bij het wisselen van pakket te voorkomen). Een toekomstige regressie van dit type wordt zo vroegtijdig opgespoord.

Hoe de update te verkrijgen

1.0.11 wordt geleidelijk uitgerold via de Play Store (start bij 20% van de gebruikers, daarna geleidelijk oplopend tot 100% over 24 tot 48 uur). Ze zou binnen twee dagen voor iedereen beschikbaar moeten zijn. Het is ook mogelijk om de controle te forceren vanuit de Play Store-app, sectie "Apps en toestel beheren".

Openen in Google Play