Jakim cudem tapeta zabija telefony z Androidem? Wszystko przez jeden piksel
Krótka historia o tym, jak jeden mikroskopijny punkt na zwyczajnym zdjęciu zawiesił setki telefonów na całym świecie.
05.06.2020 | aktual.: 05.06.2020 16:40
W ostatnich dniach głośno jest o tapecie, która zamienia telefony z Androidem w cegły. Gdy pojawiły się ostrzeżenia, by pod żadnym pozorem tej tapety nie ustawiać, ludzie zaczęli - a jakże - masowo ją ustawiać. W efekcie sieć została zalana filmami, na których uwieczniono smartfony znajdujące się w pętli restartów.
Wiadomo już, że Google pracuje już nad rozwiązaniem problemu. Przyjrzyjmy się jednak temu, dlaczego w ogóle Android nie potrafi sobie poradzić z - wydawałoby się - zwyczajną tapetą.
Tapeta psująca Androida. Oto zdjęcie będące źródłem problemów
Osławiona tapeta jest tak naprawdę fragmentem zdjęcia z serwisu hdqwalls. Autorem fotografii, którą wykonano Nikonem D850, jest Gaurav Agrawal.
Czy fotograf umyślnie umieścił w swoim zdjęciu jakiś złośliwy kod? Nic z tych rzeczy. Doszło po prostu do bardzo niefortunnego zbiegu okoliczności, który w połączeniu z drobną niedoróbką Androida okazał się tragiczny w skutkach.
Kilka słów o przestrzeniach barw
Wszystkie polecenia wykonywane przez urządzenia komputerowe muszą być wydawane za pomocą komend złożonych z ciągu zer i jedynek. Aby smartfon wiedział, jakiego koloru mają być piksele składające się na wyświetlany obraz, muszą być one przedstawione za pomocą matematycznych modeli. Stąd istnienie tzw. przestrzeni barwowych, w ramach których każdy odcień opisany jest kodem zrozumiałych przez różne urządzenia.
Nie istnieje jednak przestrzeń barwowa, którą można by uznać za jedyną słuszną, bo wszystko zależy od potencjalnych zastosowań. W branży informatycznej najpopularniejszym standardem jest sRGB (standarised Red, Green, Blue - ustandaryzowany czerwony, zielony i niebieski).
Przestrzeń sRGB obejmuje 256 odcieni każdej z trzech barw podstawowych (czerwona, zielona i niebieska). Kombinacje tych odcieni sprawia, że urządzenia obsługujące tę paletę są w stanie odróżnić 16 777 216 kolorów. Z pewnością niejednokrotnie spotkaliście się z tą liczbą, np. sprawdzając szczegółową specyfikację jakiegoś ekranu.
O ile dla zwykłego użytkownika 16,78 mln kolorów to wynik aż nadto wystarczający, o tyle dla profesjonalnego fotografa, grafika czy filmowca niekoniecznie. Dlatego istnieją alternatywne, szersze przestrzenie barw.
I tu przechodzimy do źródła problemu z felerną tapetą. Wspomniana fotografia wykorzystuje opracowaną przez kodaka przestrzeń barw ProPhoto RGB, która jest znacznie szersza od spopularyzowanego RGB.
To samo w sobie problemem nie jest, bo nowoczesne systemy operacyjne - w tym Android - potrafią "w locie" konwertować przestrzenie barw. Po prostu kolor znajdujący się poza obsługiwaną paletą zamieniany jest przez najbardziej mu odpowiadający z przestrzeni sRGB.
Problem z tapetą powodowany jest tak naprawdę przez jeden piksel
Aby system operacyjny mógł prawidłowo przekonwertować obraz z jednej przestrzeni barw na drugą, musi wyliczyć tzw. luminancję pikseli. W Androidzie do wersji 10 odpowiada za to wzór 0,2126 * R + 0,7152 * G + 0,0722 * B, gdzie R, G i B to odcienie czerwieni, zieleni i błękitu opisane wartościami od 0 do 255.
Jako że maksymalna wartość każdej z barw podstawowych to 255, wynik tego działania nie powinien być wyższy niż 255. Wszak 0,2126 + 0,7152 + 0,0722 = 1.
Serwis XDA Developers odkrył, że jeden z pikseli na wspomnianym zdjęciu opisany jest następującymi wartościami:
- R = 255
- G = 255
- B = 243
Jeśli jesteście ciekawi, o którym pikselu mowa, z pomocą przychodzi Mrwhosetheboss
Podstawmy teraz te wartości pod wspomniany wzór:
- 0,2126 * 255 = 54,213
- 0,7152 * 255 = 182,376
- 0,0722 * 243 = 17,5446
Zsumowanie tych liczb daje wynik 254,1336, a więc mieszczący się w zakresie 0-255. Tu jednak zaczynają się schody.
Wspomniana tapeta ma rozdzielczość 2560 x 1440, co oznacza, że złożona jest z 3 686 400 pikseli. Właśnie tyle razy musi zostać zastosowany wspomniany wzór, tylko po to, by przekonwertować tapetę. Aby usprawnić wyliczenia, oprogramowanie unika ułamków, dlatego wszystkie liczby są zaokrąglane w górę.
Ostatecznie luminancja wspomnianego piksela wyliczana jest więc działaniem 55 + 183 + 18, którego wynik to 256.
Jak wspomniałem wcześniej, wynik nie powinien przekroczyć liczby 255. Gdy jednak tak się dzieje (na co matematyczne prawdopodobieństwo jest ekstremalnie małe), oprogramowanie otrzymuje liczbę, której nie potrafi zinterpretować. To w chwili zmiany tapety może doprowadzić do zamienienia telefonu w cegłę.
Rozwiązanie tego problemu jest jednak banalne
Wszystko, co musi zrobić Google, to wprowadzić do oprogramowania jedną linijkę kodu, która da smartfonowi znać, że luminancja przekraczająca 255 powinna być interpretowana jako 255.
Warto odnotować, że w Androidzie 11 - z uwagi na inny sposób zarządzania kolorami - problem ten już nie występuje. Zanim jednak ten i nowsze wersje systemu trafią do wszystkich użytkowników, miną długie lata, dlatego miejmy nadzieję, że stosowna łatka znajdzie się już w lipcowej aktualizacji zabezpieczeń.