常見log異常型別: JE NE KE EE(external(modem) exception)
一、常見應用異常搜尋關鍵資訊
1. 常見應用crash的(系統提示***已停止執行) ,可以在main log中或crash_log中直接搜尋“ fatal exception” ;也可以在event_log中搜尋am_crash快速定位到問題
2.應用閃退
應用閃退一般有如下三種原因:
1).目前遇到最多的主要是因為low memory killer機制在記憶體達到一定閾值的時候會將大於對應adj程式給kill掉(這個一般在kernel log中搜尋關鍵字“ low memory kill ”就可以確認哪些是因為lmk機制而被kill);一般此情況下跟效能有關……。 【待實驗驗證】
2). 關聯程式被kill導致;
一般在進行閃退分析時可以在events log中搜尋關鍵字" am_kill "或者" in dying proc "等
3).應用本身邏輯有執行finish動作而出現,比如點選鎖屏通知進入某個對應介面而介面沒有出現,這種情況需要分析對應的main_log、event_log;
a:根據出現閃退時間點在event_log搜尋am_resume_activity等am_*_activity相關判斷這過程中應用是否有啟動和退出的動作。 【待實驗驗證】
b: 在main_log或sys_log搜尋“ACT-AM_”相關資訊檢視對應activy生命週期相關資訊。【待實驗驗證】
其次就根據log跟蹤對應程式碼流程……
二、ANR (Application Not Responding)
1.ANR種類
1). Key Dispatch Timeout (8s)
按鍵或觸控事件在特定時間內無響應(origin:5s)
KEY_DISPATCHING_TIMEOUT = 8*1000
2) .Broadcast Timeout
BroadcastReceiver在特定時間內無法處理完成
BROADCAST_FG_TIMEOUT: 10s
BROADCAST_BG_TIMEOUT: 60s
按鍵和廣播事件時間內未響應,時間限定定義在ActivityManagerService.java類中
3).Service Timeout (20s)——-小概率型別
Service在特定的時間內無法處理完成
service時間內未響應時間限定在ActiveServices.java類中
SERVICE_TIMEOUT = 20*1000;
2.ANR產生原因 【不是很懂】
1)應用程式有一個主執行緒(main thread)和一個資訊佇列(main message queue) main thead == activity thread
2)主執行緒負責處理像Draw、Listen、receive等UI事件
3)主執行緒負責從訊息佇列中取出資訊並分發它
4)主執行緒在完成當前資訊處理之前,不會再取資訊佇列中的資訊
5)如果主執行緒在處理當前資訊時卡住,沒有及時分發,ANR就會出現
3.如何避免ANR
1):UI執行緒儘量只做跟UI相關的工作
2):耗時的工作(比如資料庫操作,I/O,連線網路或者別的有可能阻礙UI執行緒的操作)把它放入單獨的執行緒處理
3):儘量用Handler來處理UIthread和別的thread之間的互動
4.UI執行緒主要包括哪些?
1).Activity:onCreate(), onResume(), onDestroy(), onKeyDown(), onClick()等
2).AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel等
3).Mainthread handler: handleMessage(), post*(runnable r)等
4).other
5.分析ANR需要的log
1). MTKlog,主要是其中的Aee_exp和MobileLog
2). Trace.txt檔案(data/anr目錄下)或者bugreport日誌(使用adb bugreport > bugreport.txt或者GAT工具輸出)
一般當出現異常(JE\SWT\NE\KE等)時,會在手機中的/data/aee_exp目錄下儲存異常的db。 對於異常的型別和具體資訊,需要通過GAT工具解析db檔案。
6.ANR分析流程