一. 概述
在調試分析Android的過程中,比較常用的地查看EventLog,非常簡潔明瞭地展現當前Activity各種狀態,當然不至於此,比如還有window的信息。那麼本文就列舉以下am相關的tags含義。
本文涉及的源碼類有EventLog.java, EventLogTags.java,另外tags格式的定義位於文件/system/etc/event-log-tags
。
如果在終端輸入:
logcat -b events
那麼會輸出大量類似這樣的信息:
- 06-01 13:44:55.518 7361 8289 I am_create_service: [0,111484394,.StatService,10094,7769]
- 06-01 13:44:55.540 7361 8343 I am_proc_bound: [0,3976,com.android.providers.calendar]
- 06-01 13:44:55.599 7361 8033 I am_create_service: [0,61349752,.UpdateService,10034,1351]
- 06-01 13:44:55.625 7361 7774 I am_destroy_service: [0,61349752,1351]
- ...
通過字面意思,就能得到不少信息量,比如am_create_service,創建service,但是後面括號中內容的具體含義,其實有很高的價值。 接下來通過一張表格來展示含義。
二. EventLog
2.1 ActivityManager
Num | TagName | 格式 | 功能 |
---|---|---|---|
30001 | am_finish_activity | User,Token,TaskID,ComponentName,Reason | |
30002 | am_task_to_front | User,Task | |
30003 | am_new_intent | User,Token,TaskID,ComponentName,Action,MIMEType,URI,Flags | |
30004 | am_create_task | User ,Task ID | |
30005 | am_create_activity | User ,Token ,TaskID ,ComponentName,Action,MIMEType,URI,Flags | |
30006 | am_restart_activity | User ,Token ,TaskID,ComponentName | |
30007 | am_resume_activity | User ,Token ,TaskID,ComponentName | |
30008 | am_anr | User ,pid ,Package Name,Flags ,reason | ANR |
30009 | am_activity_launch_time | User ,Token ,ComponentName,time | |
30010 | am_proc_bound | User ,PID ,ProcessName | |
30011 | am_proc_died | User ,PID ,ProcessName | |
30012 | am_failed_to_pause | User ,Token ,Wanting to pause,Currently pausing | |
30013 | am_pause_activity | User ,Token ,ComponentName | |
30014 | am_proc_start | User ,PID ,UID ,ProcessName,Type,Component | |
30015 | am_proc_bad | User ,UID ,ProcessName | |
30016 | am_proc_good | User ,UID ,ProcessName | |
30017 | am_low_memory | NumProcesses | Lru |
30018 | am_destroy_activity | User ,Token ,TaskID,ComponentName,Reason | |
30019 | am_relaunch_resume_activity | User ,Token ,TaskID,ComponentName | |
30020 | am_relaunch_activity | User ,Token ,TaskID,ComponentName | |
30021 | am_on_paused_called | User ,ComponentName | |
30022 | am_on_resume_called | User ,ComponentName | |
30023 | am_kill | User ,PID ,ProcessName,OomAdj ,Reason | 殺進程 |
30024 | am_broadcast_discard_filter | User ,Broadcast ,Action,ReceiverNumber,BroadcastFilter | |
30025 | am_broadcast_discard_app | User ,Broadcast ,Action,ReceiverNumber,App | |
30030 | am_create_service | User ,ServiceRecord ,Name,UID ,PID | |
30031 | am_destroy_service | User ,ServiceRecord ,PID | |
30032 | am_process_crashed_too_much | User ,Name,PID | |
30033 | am_drop_process | PID | |
30034 | am_service_crashed_too_much | User ,Crash Count,ComponentName,PID | |
30035 | am_schedule_service_restart | User ,ComponentName,Time | |
30036 | am_provider_lost_process | User ,Package Name,UID ,Name | |
30037 | am_process_start_timeout | User ,PID ,UID ,ProcessName | timeout |
30039 | am_crash | User ,PID ,ProcessName,Flags ,Exception,Message,File,Line | Crash |
30040 | am_wtf | User ,PID ,ProcessName,Flags ,Tag,Message | Wtf |
30041 | am_switch_user | id | |
30042 | am_activity_fully_drawn_time | User ,Token ,ComponentName,time | |
30043 | am_focused_activity | User ,ComponentName | |
30044 | am_home_stack_moved | User ,To Front ,Top Stack Id ,Focused Stack Id ,Reason | |
30045 | am_pre_boot | User ,Package | |
30046 | am_meminfo | Cached,Free,Zram,Kernel,Native | 內存 |
30047 | am_pss | Pid, UID, ProcessName, Pss, Uss | 進程 |
下面列舉tag可能使用的部分場景:
- am_low_memory:位於AMS.killAllBackgroundProcesses或者AMS.appDiedLocked,記錄當前Lru進程隊列長度。
- am_pss:位於AMS.recordPssSampleLocked(
- am_meminfo:位於AMS.dumpApplicationMemoryUsage
- am_proc_start:位於AMS.startProcessLocked,啓動進程
- am_proc_bound:位於AMS.attachApplicationLocked
- am_kill: 位於ProcessRecord.kill,殺掉進程
- am_anr: 位於AMS.appNotResponding
- am_crash:位於AMS.handleApplicationCrashInner
- am_wtf:位於AMS.handleApplicationWtf
- am_activity_launch_time:位於ActivityRecord.reportLaunchTimeLocked(),後面兩個參數分別是thisTime和 totalTime.
- am_activity_fully_drawn_time:位於ActivityRecord.reportFullyDrawnLocked, 後面兩個參數分別是thisTime和 totalTime
- am_broadcast_discard_filter:位於BroadcastQueue.logBroadcastReceiverDiscardLocked
- am_broadcast_discard_app:位於BroadcastQueue.logBroadcastReceiverDiscardLocked
Activity生命週期相關的方法:
- am_on_resume_called: 位於AT.performResumeActivity
- am_on_paused_called: 位於AT.performPauseActivity, performDestroyActivity
- am_resume_activity: 位於AS.resumeTopActivityInnerLocked
- am_pause_activity: 位於AS.startPausingLocked
- am_finish_activity: 位於AS.finishActivityLocked, removeHistoryRecordsForAppLocked
- am_destroy_activity: 位於AS.destroyActivityLocked
- am_focused_activity: 位於AMS.setFocusedActivityLocked, clearFocusedActivity
- am_restart_activity: 位於ASS.realStartActivityLocked
- am_create_activity: 位於ASS.startActivityUncheckedLocked
- am_new_intent: 位於ASS.startActivityUncheckedLocked
- am_task_to_front: 位於AS.moveTaskToFrontLocked
2.2 Power
Num | TagName | 格式 | 功能 |
---|---|---|---|
2722 | battery_level | level, voltage, temperature | |
2723 | battery_status | status,health,present,plugged,technology | |
2730 | battery_discharge | duration, minLevel,maxLevel | |
2724 | power_sleep_requested | wakeLocksCleared | 喚醒鎖數量 |
2725 | power_screen_broadcast_send | wakelockCount | |
2726 | power_screen_broadcast_done | on, broadcastDuration, wakelockCount | |
2727 | power_screen_broadcast_stop | which,wakelockCount | 系統還沒進入ready狀態 |
2728 | power_screen_state | offOrOn, becauseOfUser, totalTouchDownTime, touchCycles | |
2729 | power_partial_wake_state | releasedorAcquired, tag |
部分含義:
- battery_level: [19,3660,352] //剩餘電量19%, 電池電壓3.66v, 電池溫度35.2℃
- power_screen_state: [0,3,0,0] // 滅屏狀態(0), 屏幕超時(3). 當然還有其他設備管理策略(1),其他理由都爲用戶行爲(2)
- power_screen_state: [1,0,0,0] // 亮屏狀態(1)
下面列舉tag可能使用的部分場景:
- power_sleep_requested: 位於PMS.goToSleepNoUpdateLocked
- power_screen_state:位於Notifer.handleEarlyInteractiveChange, handleLateInteractiveChange
三. EventLog完整語義分析
在源碼EventLogTags.java中,有大量類似的定義,那麼括號中數字是什麼含義呢? (以進程啓動爲例)
- 30014 am_proc_start (User|1|5),(PID|1|5),(UID|1|5),(Process Name|3),(Type|3),(Component|3)
am_proc_start之後緊跟着的幾個括號,其中括號裏的內容格式如下:
- (<name>|data type[|data unit])
- (<名字>|數據類型[|數據單位])
那麼(User|1|5)
==> 名字爲User, 數據類型爲1,數據單位爲5,下面再來看看數據類型
和數據單位
:
3.1 數據類型
- 1: int
- 2: long
- 3: string
- 4: list
數據類型中int和string用得最多.
3.2 數據單位
- 1: Number of objects(對象個數)
- 2: Number of bytes(字節數)
- 3: Number of milliseconds(毫秒)
- 4: Number of allocations(分配個數)
- 5: Id
- 6: Percent(百分比)
3.3 實例解析
有了前面的準備知識,再來完整的看看如下語句:
- am_proc_start (User|1|5),(PID|1|5),(UID|1|5),(Process Name|3),(Type|3),(Component|3)
- am_proc_start: [0,9227,10002,com.android.browser,content provider,com.android.browser/.provider.BrowserProvider2]
含義如下:
進程啓動: UserId=0, pid=9227, uid=10002, ProcessName=com.android.browser, 數據類型=ContentProvider, 組件=com.android.browser/.provider.BrowserProvider2