1. 程式人生 > >記一次小米 note3 開機黑屏處理過程

記一次小米 note3 開機黑屏處理過程

從第一次購買小米的藍芽音箱,到後面自己以及推薦家人購買小米、紅米手機,再到購買路由器、智慧攝像頭、耳機這些周邊產品,自己也慢慢成為了一個米粉。今天下班後,女朋友說她的小米 note3 黑屏宕機了,重啟無效。頓時對小米略感失望,兩千塊錢的手機剛用半年而已。想到送到售後八九不離十又是給刷機處理,自己又不想丟失手機內的資料,所以決定自己嘗試解決,經過半個多小時成功解決。

症狀

首先,說明下手機的症狀:開機後顯示正常,操作大約 1 分鐘左右,黑屏。虛擬按鍵有效,回到桌面桌布丟失,顯示黑色,桌面觸控無效。

解決

說下解決思路:通過系統 log 定位原因,根據具體原因進行解決。

解決過程:

  • 重啟手機,在手機螢幕失靈前,快速操作開啟開發者模式、USB 除錯開關,方便使用 adb 命令操作手機及檢視 log
  • 第一個想到的是系統桌面出現錯誤,導致觸控失效,之前在原生系統下遇到過類似情況。使用 adb 命令安裝第三方桌面並啟用後,發現問題依舊存在
  • 既然不是桌面問題,那就看看系統 log 吧。adb 連線電腦後,檢視控制檯輸出,FATAL EXCEPTION 竟然一直在刷,定位到了問題所在。log 如下:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.android.systemui, PID: 9647
java.lang.RuntimeException: Unable to create service com.android.systemui.SystemUIService: java.lang.IllegalArgumentException: Bad file path: /data/system_ce/0
/recent_images/99900699_activity_icon_1536401283653.png passed for userId 999 // 此處省略一些 log // ... Caused by: java.lang.IllegalArgumentException: Bad file path: /data/system_ce/0/recent_images/99900699_activity_icon_1536401283653.png passed for userId 999 // 此處省略一些 log // ... E/Launcher: 連線Service 失敗 // ...

問題很清晰了,systemui 這個程序丟擲的執行時異常,導致問題出現。具體下去是由於 /data/system_ce/0/recent_images/99900699_activity_icon_1536401283653.png 這個圖片已損壞,這個圖片是做什麼用的呢?

RecentsActivity

  • RecentsActivity 是 SystemUI 用於顯示最近使用的應用列表,當用戶點選 Switch 按鍵時會啟動 RecentsActivity。
  • RecentsActivity 的啟動之前有一個 Task 資料的預載入過程,包括 task 的獲取、應用縮圖的獲取,具體實現在 preloadRecents() 方法中實現。
  • Android 7.0 中,系統會按 userid 儲存最近開啟應用的 Tasks、Image、Activity-Icon,路徑示例如下:
    • 使用者 id 為 0 的 Tasks:/data/system_ce/0/recent_tasks/12_task.xml
    • 使用者 id 為 0 的 Image:/data/system_ce/0/recent_images/12_task_thumbnail.png
    • 使用者 id 為 0 的 Activity-Icon:/data/system_ce/0/recent_images/12_activity_icon_18213511xxxx.png
    • 使用者 id 為 0 的所有 tasks-id:/data/system_de/0/persisted_taskIds.txt

因為 Task 的相關資訊是儲存在 xml 檔案中的,所以我們在系統重啟後,最近任務中仍可以看到最近開啟應用。

  • 其中的 image 縮圖是在 Activity 的 onPause 之後進行截圖的

到這裡,就明白了原來剛才那個已損壞的圖片是最近應用的儲存的 Activity-Icon。那麼,我們把該應用從最近應用欄移除,不讓 RecentsActivity 去載入那個已損壞的圖示,問題不就迎刃而解了嗎。

再次重啟手機,在手機失去控制前,快速劃掉所有的最近應用程式,手機不會崩潰了,問題順利解決。這個問題通過刷機當然也可以解決,但是感覺有些大動干戈,找到問題所在,對症下藥,不是更合適嗎?