本文翻译自:https://www.androidauthority.com/android-wallpaper-crash-1124577/
原文作者:Bogdan Petrovan | @bogdan247
1 演示视频
一个简单的图片是如何使得 Android 手机无法使用而崩溃?随着“被诅咒的壁纸”的消息在网络上传播,这个问题在过去的 24 小时内经常出现。
2 壁纸导致崩溃
有几种解决方案,具体取决于手机受到的损坏程度。 一些用户能够在两次崩溃之间的短暂间隔内更改壁纸。 其他人则使用恢复工具 TWRP 成功删除了壁纸。 但是在大多数情况下,唯一的解决方案是将手机重置为出厂设置,但是会丢失所有未备份的数据。
Ice Universe 揭露了这个问题,中国的 Twitter 用户同样也遇到此问题。 根据用户报告,三星和 Google 的许多型号手机都受到了影响,而且我们还看到了 OnePlus,诺基亚和小米设备的用户的一些报告(尚不清楚这些设备是否运行了库存软件或自定义 ROM)。 但从我们自己的测试和查看的用户报告来看,华为设备似乎较少遭受壁纸崩溃的问题。
注意:不要将这张图片设置为壁纸,特别是三星手机用户,它将会导致你的手机崩溃,请别去尝试。如果别人向你发送了此图片,请忽略它
该问题会影响运行 Android 10 的最新手机,但事实证明,这并不是真正的新问题。 几年来,用户一直在报告类似的问题,而就在上个月,Android Police 报道了一个似乎与之密切相关的问题,具体影响了运行 Google Wallpapers 应用的 Pixel 手机。
3 我们向开发者询问此问题
这是一个很奇怪的问题,有可能成为更广泛的问题,尤其是在巨魔介入的情况下。 可以很容易地预想那些不受欢迎的角色会被壁纸诱捕,然后将它们作为“恶作剧”发送给毫无戒心的用户。发生什么了?我们已经对此问题进行了一些解释,其中大多数涉及图像的色彩空间,这超出了 Android 的 SystemUI 可以处理的范围,最终导致崩溃。
为了更好地了解 Android 壁纸崩溃的原因,我们联系了 POSP 定制 ROM 项目的首席开发人员之一 Davide Bianco,他为 AOSP 错误跟踪器提交了此问题的初始补丁。
Davide 为 Android Authority 读者亲切地解释了图片如何引起此类问题,并警告说这只是他的“个人观点”。 以下是他的简短说明:
此处的主要问题是 SystemUI 仅处理壁纸的 sRGB 图像,而没有针对非 sRGB 壁纸的任何检查。这可能会导致 ImageProcessHelper 类中的特定崩溃,因为用于访问数组的变量会超出数组范围。
下面是方法定义,供参考:
private int[] getHistogram(Bitmap grayscale) {
int width = grayscale.getWidth();
int height = grayscale.getHeight();
// TODO: Fine tune the performance here, tracking on b/123615079.
int[] histogram = new int[256];
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
int pixel = grayscale.getPixel(col, row);
int y = Color.red(pixel) + Color.green(pixel) + Color.blue(pixel);
histogram[y]++;
}
}
return histogram;
}
此变量称为 y,它是当前扫描像素 rgb 值的总和。该像素是通过扫描灰度图片表面的每一行和每一列获得的。每次获得像素时,我们将其 rgb 值的总和(通常最大为 255)分配给 y,并使用所述变量访问直方图数组的元素(其大小最大为 256)并对该元素进行处理。
现在,对于正常的灰度图像,rgb 值的总和始终为 255,但这不是正常的图像。变量 y 超过255,并生成一个超出范围的异常(SysUI 中的任何异常都被视为致命异常,因为每次 SysUI 启动都会处理图像,因此导致死机的无限循环)。现在,一种解决方案可能是在为 y 赋值之后添加检查,如果该值超过最大范围,则该值基本上将 y 设置为 255。这确实有效,但是由于某种原因,我们的质量会变差。
LineageOS 的人员能够发现由于舍入不佳而导致发生此特定问题,主要是因为 rgb 值始终舍入为 ceil 而不是正常舍入。他们能够通过手动舍入值来修复它,显然这种方法还保留了质量,但是我真的不知道如何做到这一点,主要是因为 SysUI 似乎总是将图像转换为 sRGB,从而在色空间为更大。
9to5Google 开发人员还发现该问题在 Android 11 上也不会发生,因为图片在以任何方式处理之前始终会转换为 sRGB。
我还尝试使用 photoshop 或 gimp 制作自己破碎的图像,但是 SysUI 始终将图像转换为安全的色彩空间,不会导致崩溃(但会丢失 ofc 色)。我尝试提取破损的图像颜色配置文件并在新图像中使用它,但仍然无法使 SysUI 崩溃。
4 这是一个好消息,同时也是一个坏消息

坏消息是这个问题现在已经公开了,您可以打赌有些人会用它来作恶。 更令人担忧的是,此 BUG(或一个非常类似的 BUG)似乎已经存在了至少两年之久,Google 并没有采取任何行动。
另一个坏消息是:如果您成为恶作剧的受害者(或由于您自己的好奇心,把这张图片设置为了壁纸),没有简单、轻松的方法来消除它。 至少恢复出厂设置是万不得已的方法,但是我们仍然不建议您在自己的设备上尝试恢复出厂设置。
好消息是,这似乎是一个简单的 BUG,而不是恶意软件或其他更邪恶的东西。 我们之所以说“似乎”,是因为我们没有收到 Google 的回复以进行确认。 另一个好消息是一旦 Android 11 于今年晚些时候登陆,此 BUG 就不会成为问题。
原壁纸(无压缩)下载:
提取码:
(本文完)
演示视频,没有加载出来,而且这个收藏是给予浏览器的,请了缓存就没了
演示视频是 YouTube,免注册登录用户收藏文章清了缓存是会没!