常見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分析流程











