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.

Jakim cudem tapeta zabija telefony z Androidem? Wszystko przez jeden piksel
Miron Nurski

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).

Paleta barw sRGB to rynkowy standard
Paleta barw sRGB to rynkowy standard

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.

Przestrzeń barw ProPhoto RGB jest dużo szersza niż sRGB
Przestrzeń barw ProPhoto RGB jest dużo szersza niż sRGB

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ń.

Źródło artykułu:WP Komórkomania
Wybrane dla Ciebie
Komentarze (90)