新鮮事 > 萬花筒 > 正文

千萬不要把這張圖片設為手機壁紙

這張圖片已經過處理,不會導致死機

無論是 Android 還是 iOS 系統,每隔一段時間就會出現奇怪的 Bug 導致手機卡死甚至不斷重啟無法開機。Bug 的元兇有時候是奇怪的 Emoji,有時候是其他國家比較少見的文字導致的排版問題,而最近 Android 系統碰上了新"玩法":只要你把這張圖片設為壁紙,手機就會不斷重啟,甚至會清空手機數據(所以千萬不要嘗試)!

Bug 症狀

就是上面這張圖片最近在推特、微博等平台廣為流傳,最初人們都把它當做是玩笑,但部分不信邪的用戶"作死"後紛紛發出自己手機的慘狀。他們中有屏幕不斷閃爍的,有直接進入 Recovery 恢復模式的,甚至有直接清空數據恢復出廠的,後果可謂非常嚴重。這其中又以谷歌和三星手機數量最多,詳細的原因後面我們會談到。

中招的手機

這張壁紙是裁剪成手機比例的圖片,解像度為 1440*2560。我們用谷歌搜索這張圖片,會發現相似圖片裡面有橫屏的原圖,再次搜索這張原圖則只有 4 個結果,對比可以發現這張圖最早由hdqwallpaper上的一位攝影師拍攝上傳。我們把原圖下載下來之後查看 EXIF 信息,可以看到這只是張普通的風景照。

攝影師拍攝的原圖

非常神奇的地方在於,把這張原圖設為手機壁紙也會導致手機屏幕閃爍重啟,這樣排除了有人在裁剪後的手機比例圖片上做手腳的可能,是圖片本身的問題。但在相冊里查看圖片,把圖片截圖後再設為壁紙都不會有任何不好的後果。

Bug 原因

那麼這個奇怪的壁紙 Bug 是怎麼產生的呢?着名 YouTuberMrwhosetheboss花了三天時間找到了答案:照片上的一個像素令 Android 顏色管理庫壓縮色域時產生了錯誤,從而導致 SystemUI 崩潰。Mrwhosetheboss 甚至還找到了這個像素:

導致錯誤的像素,來源:Mrwhosetheboss

Android 原生自帶的顏色管理庫只支持 sRGB 色域(Android 8.0 之後支持廣色域管理,但必須開發者手動給應用 Activity 啟用才行),而通過圖片查看軟件我們可以看到這次產生 Bug 的照片本身是 ProPhoto RGB 色域,兩個色域的關係可以看下面這個圖:

兩個色域的對比,來源:維基百科

我在《顯示器完全指南》的第一章(可免費試讀)中有講解過色域,簡單來說就是色域表示顯示設備能顯示的顏色範圍,採用相同色域的顯示器能夠比較好地顯示/打印相同的效果,避免同一張圖片在不同顯示設備中顏色不同。

這樣 Android 手機想要把圖片正常顯示就必須把比較廣的 ProPhoto RGB 色域通過算法壓縮到 sRGB 色域,因此會導致圖片顏色變淡,我們可以通過微博上傳剛剛下載的原始圖片來查看轉換效果(因為微博也不支持 ProPhoto RGB 圖片),正因為如此微博上下載的這張圖一般也搞壞不了你的 Android 手機。

微博上傳效果

當壓縮到上面提到的那一個像素時問題就出現了,按照系統自帶轉換像素亮度的算法,像素亮度共有(0-255)256 個階級,這個像素轉換之後像素亮度應該是 254:

轉換算法與轉換後的像素亮度

但為了避免最後的數字是浮點數(小數),這個算法好死不死有個取整數步驟,把紅綠藍三個子像素取整到下一個整數,這樣加起來最後得到了 256 這個並不存在的像素亮度:

取整後的像素亮度

於是系統就不知道該怎麼應對這種沒見過的情況,加上谷歌本身並沒有為這種情況寫好解決方法,所以程序就會拋出(try)錯誤,同時由於沒有捕捉(catch)到錯誤於是顏色管理部庫在的 SystemUI 系統界面便會崩潰,便產生了我們看到的不斷閃屏和系統自救進入的 Recovery 模式。

這個 Bug 的產生,只是因為一張圖片上一個像素與算法的"巧妙結合"。其實手機系統異常複雜,總有些邊邊角角會導致各種奇怪的問題,但發現問題後修復也很簡單,我和 Mrwhosetheboss 還有其它知道原因的人,第一反應就能得出解決方法,只要給轉換後的像素亮度加一個 if 判斷,大於 255 就設置為 255 就可以了。

這也解釋了為什麼很多國產手機和魔改了 Android 系統的手機能夠"免疫"這個問題,他們的程式設計師或是因為要實現廣色域管理等原因重寫了顏色管理庫,也有可能順手加上了一個 if 判斷,從而避免了錯誤的發生。

解決方法

很多"手賤"的用戶最後不得不捨棄自己手機上的數據恢復出廠設置,或者直接送去手機店修理,但其實我們還有方法可以拯救中招的手機。

開機後趁屏幕黑屏時雙擊電源鍵打開相機,接着長按開機鍵出現電源菜單,長按關機/重啟會彈出安全模式提示,確認後手機會自動重啟進入安全模式。

進入安全模式

如果手機沒有電源鍵雙擊打開相機功能或者開機後無法操作,可以開機時一直按住音量鍵(上/下,有些手機需要按特定次數,可以用搜尋引擎搜索"機型 + 安全模式"),這樣手機便會進入安全模式。

進入安全模式之後壁紙會變成默認的,這個時候手機便可以正常操作。我們解鎖手機,打開系統設置 → 應用 → 應用管理,在應用列表中找到我們的默認桌面和鎖屏(如果有的話,有些手機需要在右上角選擇"顯示系統應用"),把它們的應用數據清除。

清除相關應用數據

這樣我們會丟失掉桌面佈局等桌面數據,但正常重啟之後壁紙會變成手機默認壁紙,這樣一台中招的手機就搶救回來了。

小結

手機系統是非凡軟件工程成就,裏面錯綜複雜,即使大公司擁有千千萬萬的工程師也無法面面俱到。每隔一段時間肯定會有新的奇怪玩意導致我們手機出問題,所以平時我們在上網的時候要注意管住自己的好奇心,不要輕易嘗試轉發、複製、下載各種奇怪的字符/Emoji/圖片,不然很可能就要和自己愛機上的數據說拜拜了。

責任編輯: 李華  來源:少數派 轉載請註明作者、出處並保持完整。

本文網址:https://hk.aboluowang.com/2020/0608/1461895.html