一. 概述
在调试分析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
Window相关
wm_task_moved: 位于TaskStack.positionTask()
TaskId, toTop ? 1 : 0, position;
206,1,3,是指吧TaskId=206的移动到栈顶(即该栈的长度为4)
am_home_stack_moved: 位于ASS.moveHomeStack
CurrentUser, toFront ? 1:0 , homStackId, FocusedStackId
0,1,0,0, 是指userId=0, home栈顶的StackId=0, 当前focusedStackId=0,
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之后紧跟着的几个括号,其中括号里的内容格式如下:
(|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