Druga poprawka skierowana na Samsung Galaxy A06 w ciągu dwóch dni. Wersja 1.0.10, wydana wczoraj, naprawiała awarię przy uruchamianiu na tym urządzeniu; 1.0.10 była zainstalowana zaledwie od kilku godzin, gdy w Google Play Console pojawił się nowy, inny problem — tym razem ANR (aplikacja zawieszona na kilka sekund). Szczegółowy raport umożliwił szybką naprawę, a ta wersja rozwiązuje też błąd wyświetlania efektu neonowego ikon w szufladzie aplikacji.

1.0.11 — ANR przy starcie na Samsung Galaxy A06

Objaw

Na Samsung Galaxy A06 (Android 16), przy pierwszym uruchomieniu Sola po instalacji, aplikacja zawieszała się na 5–6 sekund, zanim Android wyświetlił okno dialogowe „Sola nie odpowiada — Czekaj / Zamknij". W przeciwieństwie do awarii w wersji 1.0.10, aplikacja nie zamykała się gwałtownie: po prostu przez kilka sekund była bezużyteczna.

Technicznie, ślad zgłoszony przez Play Console wskazywał na ANR typu „Input dispatching timed out" — Android monitoruje, czy wątek główny obsługuje zdarzenia wejściowe (dotknięcie, przesunięcie) w ciągu 5 sekund. Po tym czasie system uznaje aplikację za zablokowaną i proponuje użytkownikowi jej zamknięcie.

Przyczyna

Samsung Galaxy A06 jest wyposażony w procesor z niższej półki (Unisoc T606, cztery rdzenie 1,6 GHz) i skromny GPU. Jest kilkukrotnie wolniejszy niż urządzenia, na których Sola jest zwykle testowana (Pixel 8 Pro, Pixel Tablet).

Przy uruchamianiu ekranu głównego Sola ładuje jednym przebiegiem wszystkie ikony aplikacji znajdujących się na siatce (zazwyczaj 15–25 aplikacji, plus te uporządkowane w folderach). Każda ikona przechodzi przez PackageManager.getApplicationIcon() — metodę Androida, która otwiera docelowy plik APK, odczytuje definicję XML ikony adaptacyjnej, a następnie dekoduje dwa obrazy bitmapowe (warstwę pierwszego planu i tło).

Na Pixel 8 Pro każde dekodowanie trwa około dziesięciu milisekund — 20 ikon pojawia się w mniej niż 300 ms, całkowicie niewidoczne dla oka. Na A06 to samo dekodowanie trwa od 200 do 500 milisekund na ikonę. 20 ikon × 300 ms = 6 sekund blokady. Ładowanie odbywało się na wątku głównym (tym, który obsługuje dotknięcia użytkownika), co wywoływało ANR.

Poprawka

Strumień zasilający siatkę ekranu głównego jest teraz ograniczony do puli wątków wejścia/wyjścia poprzez flowOn(Dispatchers.IO). W praktyce całe dekodowanie ikon odbywa się teraz równolegle na dedykowanych wątkach. Tylko ostateczna lista (po zdekodowaniu 20 ikon) trafia na wątek główny, aby zostać wyświetlona. Wątek główny pozostaje responsywny przez cały czas, nawet podczas ciężkiego ładowania.

Taka sama poprawka została zastosowana do strumienia, który listuje foldery wraz z ich aplikacjami, cierpiącego na ten sam problem.

Zweryfikowano na emulatorze odtwarzającym specyfikację Galaxy A06 (720×1600, 260 dpi, Android 16, programowy GPU do symulacji wolności): ekran główny wyświetla się natychmiast, żaden ANR nie jest wywoływany.

Brak efektu neonowego ikon w szufladzie aplikacji

Objaw

Przy wyborze wbudowanego pakietu ikon (Pixelarticons, Lucide, Game-Icons…) z włączoną opcją „efekt neonowy", ikony poprawnie wyświetlały świetlistą poświatę na ekranie głównym, w folderach i w docku. Ale w szufladzie aplikacji poświata znikała: ikony pojawiały się w płaskiej barwie, bez efektu neonowego.

Przyczyna

Efekt neonowy jest zaimplementowany za pomocą drawable-wrapper, który otacza oryginalną ikonę, aby dodać poświatę w momencie renderowania. Dwie różne ścieżki kodu ładują ikony aplikacji: jedna dla ekranu głównego i folderów, druga dla szuflady (która listuje wszystkie zainstalowane aplikacje naraz).

Ścieżka używana przez ekran główny miała już konkretny wyjątek zachowujący ten wrapper. Ścieżka używana przez szufladę nie miała takiego wyjątku: systematycznie wywoływała constantState.newDrawable(), aby utworzyć nową instancję drawable, co jako efekt uboczny rozpakowywało wrapper neonowy, pozostawiając tylko płaską ikonę pod spodem.

Poprawka

Wyjątek NeonDrawable został przeniesiony na ścieżkę szuflady: gdy ładowana ikona jest wrapperem neonowym, jest zachowywana bez zmian zamiast być klonowana. Efekt poświaty jest teraz zachowywany w szufladzie, tak jak wszędzie indziej.

Dodano trzy testy jednostkowe zabezpieczające obie ścieżki (ekran główny i szuflada) oraz zachowanie odwrotne (klasyczne drawable muszą być poprawnie klonowane, aby uniknąć efektów ubocznych przy zmianie pakietu). Przyszła regresja tego typu zostanie wykryta z wyprzedzeniem.

Jak uzyskać aktualizację

Wersja 1.0.11 jest wdrażana stopniowo przez Sklep Play (start od 20% użytkowników, następnie stopniowy wzrost do 100% w ciągu 24–48 godzin). Powinna być dostępna dla wszystkich w ciągu dwóch dni. Można też wymusić sprawdzenie z poziomu aplikacji Sklep Play, w sekcji „Zarządzaj aplikacjami i urządzeniem".

Otwórz w Google Play