目前 mPaaS Android 是使用的是 Crash SDK 對閃退進行的處理,Crash SDK 是 Android 平臺上一款功能強大的崩潰日誌收集 SDK,有著極高的崩潰收集率和完整、全面的崩潰日誌資訊,生成的日誌內容非常利於問題的跟進和解決。
在我們的日常運維中,經常遇到一些閃退,無法直接從閃退堆疊看到原因,尤其是一些非 Java 的 Native 的閃退,這裡分享下在 mPaaS 框架下怎麼使用 Crash SDK 對閃退進行分析。
閃退報文分析工具介紹對於 mPaaS 的使用者,從 MAS 上閃退分析平臺匯出的一般是原始的閃退資訊,閃退資訊比較多,如果直接閱讀會比較困難,使用者可以透過下載 Chrome 的外掛 LogAnalyzer。
LogAnalyzer 會將 Crash SDK 生成的日誌文字內容轉化成可視效果較強的 HTML 頁面展現,功能還是很強大的,主要包含:
高亮顯示日誌中重點資訊,並使用不同顏色區分;支援日誌內容整體結構預覽,快速定位重點內容;常見崩潰原因提醒;安裝好 Chrome 外掛後,還需要做以下配置
1. 修改閃退檔案字尾為 .txt
由於 MAS 上預設下載的檔案字尾是.dat,需要改為.txt,否則 LogAnalyzer 會不識別。
2. 修改外掛配置
由於 Chrome 預設許可權限制,任何 Chrome 外掛預設都不能訪問檔案網址,需要在 Chrome 外掛中進行如下操作。
1.開啟 Chrome 外掛管理頁面 chrome://extensions/
3.找到允許訪問檔案網址選項,並勾選;4.開啟或者重新整理日誌頁面,LogAnalyzer 就生效了。
3. 生效效果
把日誌檔案直接拖到 Chrome 後,可以看到右邊外掛生效後,可以透過不同顏色顯示閃退資訊的各個欄位。
首次開啟後的使用說明如下:
正常檢視閃退截圖如下:
閃退分析舉例我們經常在日常運維中遇到一些非 Java 的 Native 模組閃退,比如 UC。這種時候很多時候只能去聯絡 UC 團隊進行支撐,其實很多場景下,閃退的根因並不是 UC,只是最後的閃退點在 UC。
以最近日常運維中比較常遇到的 UC 核心的閃退為例,對一些案例的處理分享如下。
1. Java 空指標導致 UC 閃退
我們在閃退點上可以看到以下閃退(已經隱藏客戶 apk 相關資訊),如果只是從這看我們暫時沒有任何線索,我們繼續往下看日誌:
當看到 logcat 節點資訊的時候,我們發現了線索,首先我們看到關鍵字:begin to generate native report,表示當前是閃退日誌上報的日誌,我們再往前看,logcat 節點裡列印了異常堆疊資訊。
從堆疊資訊可以看到,是由於 precreate 操作觸發了底層的空指標,從而導致初始化異常,最後觸發了閃退。解決方案就是臨時關閉預建立,從而規避了閃退。
從上面的案例我們可以看出:
Native 的閃退不一定是 Native 模組的原因導致的,有可能是由於 Java 導致的異常,從而導致 Native 閃退;begin to generate native report 附近可以看閃退相關的 logcat 資訊,協助定位閃退的一些上下文日誌。2. 上層 OOM 導致 UC 閃退
首先我們看上報的閃退點的日誌如下圖所示,閃退在了 RenderThread 裡,也是毫無頭緒。
我們繼續硬著頭皮往下看,在 logcat 節點裡查詢 begin to generate native report 上報節點,我們看到了大量的底層 OOM 的異常日誌,基本大機率確定是 OOM 的原因了。
剩下的就是查詢 OOM 是哪裡觸發的。
但是由於核心需要佔據一部分,以及不同的 ROM 版本的差別,我們發現有以下規律:Android 8.1.0 及之後的系統,大部分 native oom crash 發生時 VmSize 分佈在 3.5 - 3.9 G 的位置,相對較為集中。所以下面的案例的解決思路就變成了怎麼解決 OOM 了。
3. FD 誤關導致 UC 閃退
上報的日誌如下圖所示,我們大概只能看出 SIGILL 有可能是主動崩潰,崩潰 ILL_ILLOPC 表示非法操作。
然後我們繼續看 logcat 節點的 begin to generate native report, 基本確認原因是因為 UC 使用的 FD 物件被其他程式關閉。
隨後 UC 提供了帶 FDscan 的工具包,透過我們復現後發現,是由於 UC 呼叫 shouldIntercept 回撥的輸入流物件被其他模組 close 掉了,導致 UC 使用的時候發現 FD 物件已經被關閉,從而做了崩潰處理。最後的處理方案就變成了使用者解決其他模組的誤關 FD 的問題。
總結綜合以上的 Case 分析,在遇到 Native 模組閃退的時候,一般如果從直接的閃退堆疊看不出原因的時候,不要心急,可以搜尋 begin to generate native report 找到崩潰上下文,多看看 logcat 閃退上下文的日誌,會有一些收穫,同時對於 oom 型別的問題,可以結合當前記憶體統計來看。