Few day's ago this tweet went viral,
People tried it anyway and this was the aftermath :
So why is this beautiful landscape picture bricking Android phones?
The answer lies in one pixel and basic math.
A pixel comprises of a color and a color comprises of three basic colors, Red, Green, Blue or RGB.
As you might remember from CSS, the typical range for R:G:B lies between 0 - 255, and android handles it well. But there's a huge range of color space which android doesn't understand and converts it RGB.
What's color space? It's basically this :
as you might see, the android sRGB space is narrow compared to other color spaces, but how is this relevant?
The above image was captured in Prophoto RGB color space, so when you open the image in the gallery, android tries to convert the image into sRGB color space, and here lies the problem.
Even dev.to converts it to relevant color space :
There's one pixel in this image that causes this issue.
So when Android comes across a photo whose color space it doesnt support it modifies the image by the following formula :
and the overall result of this must be < 255.
But for one pixel the RGB values are:
But android, instead of taking floating value rounds off the numbers:
Since 256 above the max limit, android throws an error. When we open the image in the gallery, it encounters the error and just might shut off the gallery.
But when we set the image as a wallpaper, it's like setting up an endless loop of errors. At some point the overflow and crashes the phone.
It's fix ?
pixel_value = Math.min(255,res);
//might be more complicated than this but this is my best guess
Crazy isn't it? How one pixel could crash our phones.
I hope you liked my article. Until next time :)
Source : https://twitter.com/UniverseIce/status/1266943909499826176
https://www.youtube.com/watch?v=iXKvwPjCGnY
https://del.dog/suthokuxid.log
https://twitter.com/HrX2003/status/1267049418659901440
https://hdqwalls.com/wallpaper/5120x2880/sunset-at-st-mary-lake-glacier-national-park-5k
Top comments (34)
Excellent write up! That’s interesting. Probably just a bug and considered an edge case, which is why it wasn’t caught. Very few people work with such wide color spaces, probably professional photographers. When photographers print, the color space has to be converted to whatever is most compatible for the printer / material, so there happens to be a long history of algorithms that convert color spaces.
I see this as a symptom of a much larger problem in user interface engineering. What do you expect from engineers that often ignore design / UX, where the engineers often have zero grounding in graphics processing despite coding user interfaces?
If developers use more defensive programming this would have never happened.
Color spaces are usually used so that what photographers/printers see on screen is exactly printed on paper.
I guess this was more of carless rounding of numbers.
Amazing, how just one pixel can create such a huge madness. I saw this one thing on twitter, I was a little skeptical, but then I remembered that character that broke iPhone's some time ago.
Cool post and great explication!
Yea, and to make it even worse errors like these occur very rarely and it's tough to replicate them. Thanks for reading :)
Hi Akhil,
Very interesting article and great write-up.. Obviously I tried it for myself and can verify it did the same on my Samsung Note 9.
I was able to resolve it although it was challenging. It was a race against the device's startup services.
As your device boots up,
I suppose I was very lucky I applied that image as wallpaper on the homescreen only - not both home screen and lock screen. I will not be doing this again.
This experience also raised a question for me on how to log in to Android via a terminal (on the device or off) and avoid starting the GUI manager up..
Cheers
Awesome man ! Smart that you applied only to the home screen.
Interesting read. This was patched in Android 11 properly and since backported by a LineageOS developer here, clamping down the value simply hides the problem.
Hey Akhil - nice article, easy to understand.
I feel that the fix will be in two parts:
Here the dumbest question 😅 how you show original color in dev.to if dev.to converts it? Very interesting article.
There's an interesting happening in the background.
If you directly apply this wallpaper then it will crash your phone, but if you take a screenshot of the image and then set it as wallpaper, it works fine. that's because, in gallery, android converts the photo to sRGB.
Tech becomes crazy as we deep dive into it.
Now what I did was, upload this image on a website that supported the ProPhoto color space, then I uploaded the image converted by dev.to, combined and downloaded as sRGB.
Due to this original colors were preserved.
I love to read this kind of stuff in dev.to....it's much more different that the rest of the articles like "Top 5 frameworks in javascript".
I was wondering... Is there any quick fix for this bug?
Once you setup a wallpaper, the only way to change that is successfully boot Android OS, and only then, you would be able to change the buggy wallpaper. :O
Thanks for reading the article :), I like to write about how tech works and real-life applications of algorithms etc.
And yep you're correct. Unfortunately, the fix for this was to reset the phone. Google is planning on releasing its fix soon in future updates.
I agree with @jmojico , great and entertaining article @akhilpokle
Thanks for reading my article :)
Why when white color (255,255,255) is not crashing anything?
Interesting catch. Need to dig deeper regarding this. Thanks for pointing out :)
If this article gets 256 likes, will it crash dev.to?
Share it to reach the 256 goal :P
You might also say that.. a pixel is killing Pixels.
I'll see myself out.