최근 Android EventLog를 보는 일이 많은 데 출력되는 정보의 정확한 의미를 몰라 정리하는 차원에서 이 글을 작성합니다. 이 글은 ProgramSought 사이트의 "Android EventLog Meaning"글을 기본으로 하여 최근의 Android 내용을 업데이트 했습니다. 참고하세요.
1. 개요
Android 를 디버깅하고 분석하는 과정에서 현재 Activity 의 상태변화를 간단하고 정확히 보여주는 EventLog를 보는 것이 일반적입니다. 물론 window에 대한 정보는 없습니다. 이 글은 아래의 am 관련 tag들의 의미를 열거하고 있습니다.
이 글에 포함된 source class들은 EventLog.java, EventLogTags.java 파일에 있으며, tag 포맷은 /system/etc/event-log-tags 파일에 정의되어 있습니다.
터미널에서 아래와 같이 쳐보면:
이와 같은 많은 정보가 출력됩니다:
문자 그대로 am_create_service는 create a service,와 같이 많은 정보를 얻을 수 있지만, 괄호 안 정보의 구체적인 의미는 실제 더 의미가 있습니다. 그럼 그 의미를 보여주는 표를 살펴보겠습니다.
II. EventLog
2.1. ActivityManager
Num | TagName | format | Features |
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 | Killing process |
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 | RAM |
30047 | am_pss | Pid, UID, ProcessName, Pss, Uss | process |
TAG가 사용되는 scene들은 아래 나열되었습니다:
- 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 lifecycle 연관 methods:
- 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_acitvity: AMS.setFocusedActivityLocked, clearFocusedActivity에 있습니다.
- am_restart_activty: 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이 stack의 top으로 이동한다는 의미입니다. 즉 stack의 길이는 4입니다.
- am_home_stack_moved: ASS.moveHomeStack에 있습니다.
- CurrentUser, toFront?1:0, homeStackId, FocusedStackId
- 0,1,0,0, 은 userId=0, home stack의 top 에서 StackId=0, 현재 focusedStackId=0, 를 의미합니다.
2.2. Power
Num | TagName | format | Features |
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 | Number of wake locks |
2725 | power_screen_broadcast_send | wakelockCount | |
2726 | power_screen_broadcast_done | on, broadcastDuration, wakelockCount | |
2727 | power_screen_broadcast_stop | which,wakelockCount | The system has not yet entered the ready state |
2728 | power_screen_state | offOrOn, becauseOfUser, totalTouchDownTime, touchCycles | |
2729 | power_partial_wake_state | releasedorAcquired, tag |
부분적인 의미:
- battery_level:[19,3660,352] // 남아있는 power는 19%, battery voltage는 3.66v, 그리고 battery 온도는 35.2ºC 입니다.
- power_screen_state:[0.3.0.0] //Off screen state (0), screen timeout(3), 물론 다른 장치의 관리 전략(1)도 있으며, user behavior(2) 도 있습니다.
- power_screen_state:[1,0,0,0] // 밝기 상태(1)
TAG가 사용되는 scene들은 아래 나열되었습니다:
- power_sleep_requested: PMS.goToSleepNoUpdateLocked에 있습니다.
- power_screen_state: Notifer.handleEarlyInteractiveChange, handleLateInteractiveChange에 있습니다.
III. EventLog 완전한 의미 분석
EventLogTags.java 소스코드에서는 많은 유사한 정의들이 있는데, 괄호안의 숫자의 의미는 무엇입니까? (process startup을 예로 들자면)
am_proc_start 바로 뒤에 오는 여러 대괄호는 아래와 같이 대괄호 형식으로 내용을 나타냅니다.
즉, (User|1|5)==> Name은 User, data type은 1, data unit은 5, 그럼 data type과 data unit에 대해서 살펴보겠습니다.
3.1. data type
- 1: init
- 2: long
- 3: string
- 4: list
data type에서 대부분 int와 string이 사용됩니다.
3.2. data unit
- 1: objects의 개수
- 2: bytes의 개수
- 3: milliseconds의 개수
- 4: allications의 개수
- 5: Id
- 6: 백분율
3.3. Instance Resolution
사전 지식을 바탕으로 다음 문장을 살펴보겠습니다.
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] |
문장의 의미는 다음과 같습니다:
Process startup: UserId=0, pid=9227, uid=10002, ProcessName=com.android.browser, data type=ContentProvider, component=com.android.browser/.provider.BrowserProvider2 |
※ 참고자료
www.programmersought.com/article/6684616653/
source.android.com/setup/contribute/read-bug-reports