1. 程式人生 > >一個無厘頭的bug

一個無厘頭的bug

最近 app 更新真是 bug 不停呀。前面有 Xcode 10 打 AppStore 渠道包導致部分使用者閃退,後面又出現很小概率個人中心閃退。今天就著重記錄下個人中心閃退這個無厘頭的 bug。

首先,介紹下閃退現象。新版個人中心有部分割槽域顯示的是老版本的介面,而且點選個人中心的任何一個地方都會閃退。

當然,既然有閃退,肯定會有閃退日誌的,檢視閃退日誌,顯示的是陣列第一個元素為 nil。

根據崩潰日誌,反向查詢,發現數組中存放的就是出問題那部分 UI 介面的子控制元件。由於 UI 出現問題,導致有的子控制元件為 nil, 這樣在新增到陣列中(字面量)時,就會造成崩潰。

為什麼 UI 會出現異常呢,這就是我感覺到無厘頭的地方。

因為,這部分 UI 是根據 xml 格式載入的,所以我就斷定可能是某些情況下 iOS 系統安裝 app 時,xml 檔案不替換導致的。經過不同的包發現只要是使用 xml 佈局的頁面,都會出現 xml 不會替換的問題。但是,iOS 本身是支援 xml 格式資料的,沒有理由不替換呀。為什麼單單是佈局有問題呢?

由於沒有站得住腳的結論,就只好去 FlexLib(使用 xml 佈局) 開發群裡問了群主,得知了其在 Release 下會使用快取。而且快取是根據 build 號來的。這樣就找到了問題,因為我的 build 會在新版本構造的時候重置,所以導致 app 出現了佈局混亂。其實 xml 確實是替換了,只是佈局使用的是快取。

經過一天的折騰,終於找到了問題。也算是可以安心睡個覺了,不過,還是要總結一下,以便以後快速找準方向。

  1. 輕易不要懷疑 iOS 系統。雖然 Xcode 10 確實是 Apple 的問題,但是正常情況下,還是要從其他方向著手,懷疑 Apple 作為最後一步。
  2. 輕易不要相信 第三方。程式碼都是人寫的,尤其 github 上星少的,有 bug 還是比較正常的,因為沒有那麼多人使用,問題就不會那麼容易暴露出來。
  3. 有問題及時解決。因為當時有個使用者手機出現了問題,還在我面前,我抓包看了一下,資料不對,字元型別的解析成了陣列型別。就拋給服務端了,後來想了一下,之前也有這種問題,而且是正常的。因為 charles 解析 protobuf 遇到某些數字就會出現這種情況。
  4. 一切現象都有解釋。因為 Xcode 10 導致崩潰的時候,我看到日誌有不同地方的崩潰,所以以為這個也是那個原因。而且使用者截圖的時候,安卓說了一個疑問:介面為什麼會這樣子?我當時說了一句都有可能,以為還是同一個問題。等到最終找到問題,發現這種現象是可以解釋的了。
  5. 初始化 array dictionary 時,儘量不使用字面量,這樣子就會盡量避免崩潰問題了。