打开网易新闻 查看更多图片

码个蛋(codeegg) 第 991 次推文

作者:依然范特稀西

链接:https://juejin.im/post/5edd9e33f265da76bf3dde8e

想象一下,你正在网上搜索一些精美的壁纸,并且找到了一张风景如画的风景图。它拥有一切:茂密的森林、原始的湖泊、还有一个小岛,背后是漂亮的雪山,厚厚的云层覆盖着阳光,阳光从云缝中渗入。你被深深的吸引,然后立即下载图片,将其设置为你的手机壁纸,然后开始使用了,然后你的Android手机就陷入了启动->崩溃->启动->崩溃...的循环中。听起来不太可能,但这确实是一个真实的事,并且罪魁祸首就是下面这张图片:

三星手机崩溃事件梳理

打开网易新闻 查看更多图片

5月31日,名叫Ice Universe的用户在Twitter上分享了上面这张壁纸,他声称该壁纸“将导致你的手机崩溃”,尽管有警告大家不要试,这不是在开玩笑,但仍然有很多用户下载了该壁纸,以验证他说的是否是真的-是否会让手机崩溃

Twitter讨论地址如下:https://twitter.com/UniverseIce/status/1266943909499826176

设置壁纸导致三星系统崩溃如下:

然后评论区一片哀嚎:

Sebastian:非常不幸,这是一个Android的bug,Google的 Pixels系列手机也中招了!

Dawood: 这是我见过的最扯淡的bug,我甚至开启了安全模式,但是仍然没能幸免,必须恢复出厂模式,来做一些事情。

Jason Ashley:呵呵,我在模拟器中对此进行了测试。导致SystemUI崩溃。试着检查图像header是否有任何奇怪的问题,由于我有限的JPEG知识,没有发现任何问题。它也确实正常结束了。

vl1:刚刚试了,现在不得不恢复出厂设置。

Passerby: 诺基亚手机也有同样的问题。我的诺基亚7 plus已经崩溃,并反复重启。有人知道如何解决吗?我需要帮助,谢谢

Ahmed Alkaab:该死,它确实损坏了我的三星Note 9

从该Twitter的评论区反馈来看,三星、Google Pixels、诺基亚等部分手机存在该问题,国内厂商如华为、小米、OnePlus不受影响。

问题追踪

到底是什么问题导致了手机崩溃呢?图片被施了魔法?显然不是。根据Davide Bianco(基于AOSP自定义ROM的开发负责人)的说法,这种"特殊"的壁纸会导致某些Android设备崩溃,是因为它使用了RGB颜色空间,而不是Android原生支持的sRGB颜色空间。

Bianco 已经提交了一个补丁,据报道该补丁已经解决了该问题,补丁的描述指出:当用户尝试将非sRGB的图像设置为壁纸时,就会引发此问题。发生的情况是变量y的值高于histogram的范围,从而使SysUI崩溃。一种可能的解决方法是将y值始终限制为小于256。

打开网易新闻 查看更多图片

著名的LineageOS定制ROM团队与Xian Bianco一起,由XDA高级会员BadDaemon和XDA公认的开发人员luca020400共同开发了独特的解决方案。

一份来自9to5Google的报告对此事进一步表明,问题仅限于运行Android 10以上的设备,它不影响运行在Android 11开发者预览版上的设备。这是由于:在Android 11上,如果不支持,系统会转换颜色空间,但在Android 10上则不会

Google最新回应

正如XDA高级会员BadDaemon和XDA公认的开发人员luca020400所解释的那样, 是扩展导致了这个bug。那张“被诅咒”的图片在一个特殊的颜色空间中编码,该颜色空间被称为"Google / Skia / E3CADAB7BD3DE5E3436874D2A9DEE126"这是颜色空间的全称,Skia指的是Google制作的2D图形库。)。相反,大多数其他壁纸图像均在称为“ sRGB”的色彩空间中编码。

在Android 10及更早版本中,除非开发人员另行指定,否则所有图像都将转换为sRGB。将图片转换为sRGB时,可能会发生一个罕见的错误,其中计算每个像素的“luminance(亮度)”值的代码设法超过了最大限制255。

使用以下公式计算亮度:

Luminance = .2126f * r + .7152f * g + .0722f * b

这里,“ r”,“ g”和“ b”是红色,绿色和蓝色,以0到255的8位值表示。

该计算的问题在于,它总是将最终值四舍五入。在将图像从sRGB转换为灰度的过程中,“被诅咒”墙纸中的像素之一具有以下RGB值:255、255、243,将其插入上述公式时,如下所示:

Luminance = .2126 * (255) + .7152 * (255) + .0722 * (243)
Luminance = 256

Luminance 超过了255,此值导致SystemUI崩溃,并且基本上导致整个OS崩溃,因为它超过了最大值。这个错误非常具体,因为它涉及到舍入错误和颜色空间转换错误。

此错误不会影响Android 11,因为默认情况下,图片的“Skia”颜色空间不会转换为sRGB。因此,在Android 11上不会发生此颜色空间转换错误和舍入错误。

但是,来自Google Android Toolkit团队的Romain Guy认为,此问题的根本原因仅在于计算亮度的方式,而与任何颜色空间转换问题无关。Google正在进行自己的内部测试,因此我们可能很快就会看到他们最终的结果。

如何恢复

请注意,尽管该问题并不影响所有Android设备,但我们强烈建议您不要尝试在手机上使用壁纸。如果已经尝试了,试着用下面的方式:

  • 1、进入安全模式并更改墙纸来恢复设备。三星手机操作是:在开机界面出现三星Logo画面时,按住音量下键不松手,直到出现“安全模式”字样,进入后快速抓拍一张照片设为壁纸。(不过有Twiiter用户表示此方法也无法恢复。)

  • 2、恢复出厂设置(数据丢失)

暂时只能通过这两种临时方案解决,Google已经在修复这个问题,可能会伴随着后面的系统更新来发布。因此最好不要使用确切的图片作为墙纸。如果您真的喜欢墙纸,只需对图像进行截图,然后将其用作墙纸即可。

最后再提醒一下同学们,千万不要好奇尝试!