一、查看log的方向和方式
涉及到Activity生命周期问题时,主要是查看event log (logcat -b events | grep am_)
涉及到某个生命周期(一般指am_on_xxx)耗时时,结合“Slow Looper main”查看是哪个消息耗时,app 端log的形式:am_on_xxx_called:[userId,className,reason,duration],duration是miui加的
二、常见场景的log
1、正常启动一个activity
system_server
05-29 18:17:41.616 1898 4358 I am_create_activity: [0,199662628,22,com.miui.gallery/.activity.HomePageActivity,android.intent.action.MAIN,NULL,NULL,270532608]
05-29 18:17:41.693 1898 4358 I am_restart_activity: [0,199662628,22,com.miui.gallery/.activity.HomePageActivity,24197]
// minimalResumeActivityLocked 代表从该方法调用过来
05-29 18:17:41.695 1898 4358 I am_set_resumed_activity: [0,com.miui.gallery/.activity.HomePageActivity,minimalResumeActivityLocked]
app 进程,最后两个分别是reason和时间
// 这三个reason组合的onCreate,onStart,onResume周期在app端是在同一个消息内被执行的。即这三个周期有什么延迟问题,均为app端问题。
05-29 18:17:42.400 24197 24197 I am_on_create_called: [0,com.miui.gallery.activity.HomePageActivity,performCreate,125]
05-29 18:17:42.402 24197 24197 I am_on_start_called: [0,com.miui.gallery.activity.HomePageActivity,handleStartActivity,0]
// RESUME_ACTIVITY 代表由ResumeActivityItem调用过来的,这种为system_server触发的且要求activity最终状态为resumed
05-29 18:17:42.404 24197 24197 I am_on_resume_called: [0,com.miui.gallery.activity.HomePageActivity,RESUME_ACTIVITY,1]
2、正常结束finish一个Activity
system_server
// reason代表是app触发的finish
05-29 18:28:16.495 1898 4358 I am_finish_activity: [24197,199662628,22,com.miui.gallery/.activity.HomePageActivity,app-request]
05-29 18:28:16.500 1898 4358 I am_pause_activity: [24197,199662628,com.miui.gallery/.activity.HomePageActivity,userLeaving=false]
// finishCurrentActivityLocked 代表加入stoppping列表的原因
05-29 18:28:16.505 1898 2042 I am_add_to_stopping: [0,199662628,com.miui.gallery/.activity.HomePageActivity,finishCurrentActivityLocked]
// 代表destroy的时机是activity idle的时候,不是立刻destroy
05-29 18:28:17.048 1898 2105 I am_destroy_activity: [24197,199662628,22,com.miui.gallery/.activity.HomePageActivity,finish-imm:activityIdleInternalLocked]
app端
// LIFECYCLER_STOP_ACTIVITY 表示该onStop是中间流程,因为初始状态是onPause,最终状态是onDestroy,会走完之间的流程,一般这种周期reason会带有LIFECYCLER前缀
05-29 18:28:16.504 24197 24197 I am_on_paused_called: [0,com.miui.gallery.activity.HomePageActivity,performPause,0]
05-29 18:28:17.079 24197 24197 I am_on_stop_called: [0,com.miui.gallery.activity.HomePageActivity,LIFECYCLER_STOP_ACTIVITY,1]
05-29 18:28:17.102 24197 24197 I am_on_destroy_called: [0,com.miui.gallery.activity.HomePageActivity,performDestroy,2]
3、activity之间切换
如下是前一个activity的生命周期,后一个生命周期见1 ,具体时序图见Activity 的启动流程大概是:
attention:
下一个activity onResume执行完后在主线程处于idle的时候通知system_server去stop上一个activity,如果主线程在onResume之后一直很忙,会导致onStop执行延迟,直到10s超时后system_server端主动去执行stop
system_server
05-29 15:44:37.540 1595 2425 I am_pause_activity: [5045,41736446,com.miui.gallery/.activity.HomePageActivity,userLeaving=true]
// 代表加入stopping列表的原因为要求activity不可见
05-29 15:46:41.052 1595 2425 I am_add_to_stopping: [0,41736446,com.miui.gallery/.activity.HomePageActivity,makeInvisible]
05-29 15:46:41.598 1595 1691 I am_stop_activity: [0,41736446,com.miui.gallery/.activity.HomePageActivity]
app 端
// onStop的reason STOP_ACTIVITY_ITEM 表示StopActivityItem调用
05-29 15:44:37.543 5045 5045 I am_on_paused_called: [0,com.miui.gallery.activity.HomePageActivity,performPause,0]
05-29 15:46:41.615 5045 5045 I am_on_stop_called: [0,com.miui.gallery.activity.HomePageActivity,STOP_ACTIVITY_ITEM,0]
4、熄屏时resumed activity的变化
06-10 14:39:36.417 1551 1604 I am_pause_activity: [14045,192133053,com.miui.gallery/.activity.HomePageActivity,userLeaving=false]
06-10 14:39:36.423 14045 14045 I am_on_paused_called: [0,com.miui.gallery.activity.HomePageActivity,performPause,1]
06-10 14:39:36.463 1551 1593 I am_stop_activity: [0,192133053,com.miui.gallery/.activity.HomePageActivity]
// 一般都是看onStop的原因为sleeping
06-10 14:39:36.470 14045 14045 I am_on_stop_called: [0,com.miui.gallery.activity.HomePageActivity,sleeping,0]
5、唤醒屏幕
// 主要看onRestart和onStart的reason为handleSleeping,注意的是有的情况是不会走onResume的
06-10 14:44:42.829 1760 1915 I am_set_resumed_activity: [0,com.miui.gallery/.activity.HomePageActivity,resumeTopActivityInnerLocked]
06-10 14:44:42.830 16517 16517 I am_on_restart_called: [0,com.miui.gallery.activity.HomePageActivity,handleSleeping,0]
06-10 14:44:42.831 1760 1915 I am_resume_activity: [0,201508124,34,com.miui.gallery/.activity.HomePageActivity,16517]
06-10 14:44:42.832 16517 16517 I am_on_start_called: [0,com.miui.gallery.activity.HomePageActivity,handleSleeping,1]
06-10 14:44:42.872 16517 16517 I am_on_resume_called: [0,com.miui.gallery.activity.HomePageActivity,RESUME_ACTIVITY,0]
经典案例
1.onStop/onDestory延迟执行
// 这个是正常的按下返回键返回上个页面的流程
03-24 09:57:27.560 1563 2759 I am_finish_activity: [3044,40142426,32721,com.android.settings/.Settings$PageLayoutActivity,app-request]
03-24 09:57:27.561 1563 2759 I am_pause_activity: [3044,40142426,com.android.settings/.Settings$PageLayoutActivity,userLeaving=false]
03-24 09:57:27.564 3044 3044 I am_on_paused_called: [0,com.android.settings.Settings$PageLayoutActivity,performPause,1]*
03-24 09:57:27.566 1563 4735 I am_set_resumed_activity: [0,com.android.settings/.SubSettings,resumeTopActivityInnerLocked]
03-24 09:57:27.567 1563 4735 I am_resume_activity: [0,178668836,32721,com.android.settings/.SubSettings,3044]
03-24 09:57:27.572 3044 3044 I am_on_resume_called: [0,com.android.settings.SubSettings,RESUME_ACTIVITY,1]
// 上个PageLayoutActivity 的destroy回调是在下个SubSettings onResume后将近10s才回调的,刚好是DESTROY_TIMEOUT_MSG 超时时间,说明app端onResume回调后10s内主线程都未处于idle状态
// 即主线程一直在执行消息,后面经调试发现是一个控件递归绘制一个drawable导致,即主线程一直在执行绘制消息
03-24 09:57:37.568 1563 1641 I am_destroy_activity: [3044,40142426,32721,com.android.settings/.Settings$PageLayoutActivity,finish-imm:activityIdleInternalLocked]
03-24 09:57:37.663 3044 3044 I am_on_stop_called: [0,com.android.settings.Settings$PageLayoutActivity,LIFECYCLER_STOP_ACTIVITY,1]*
03-24 09:57:37.663 3044 3044 I am_on_destroy_called: [0,com.android.settings.Settings$PageLayoutActivity,performDestroy,0]
2.onStart/onResume延迟执行
05-18 07:15:00.099 1000 1684 2700 I am_create_activity: [0,207685455,818,com.android.deskclock/.alarm.alert.AlarmAlertFullScreenActivity,NULL,NULL,NULL,277151744]
05-18 07:15:00.108 1000 1684 2700 I am_restart_activity: [0,207685455,818,com.android.deskclock/.alarm.alert.AlarmAlertFullScreenActivity,30177]
05-18 07:15:00.110 1000 1684 2700 I am_set_resumed_activity: [0,com.android.deskclock/.alarm.alert.AlarmAlertFullScreenActivity,minimalResumeActivityLocke
// 客户端的onCreate和onStart/onResume执行时间相差8s左右,鉴于客户端的LaunchActivityItem与ResumeActivityItem是同一个消息执行的,确定为客户端问题
05-18 07:15:00.288 10104 30177 30177 I am_on_create_called: [0,com.android.deskclock.alarm.alert.AlarmAlertFullScreenActivity,performCreate,8]
05-18 07:15:08.158 10104 30177 30177 I am_on_start_called: [0,com.android.deskclock.alarm.alert.AlarmAlertFullScreenActivity,handleStartActivity,0]
05-18 07:15:08.161 10104 30177 30177 I am_on_resume_called: [0,com.android.deskclock.alarm.alert.AlarmAlertFullScreenActivity,RESUME_ACTIVITY,2]
// 查找app主线程的log,查找可能的耗时原因,主线程调用IContentProvider的query接口耗时将近8s,确定原因
05-18 07:15:08.088 10104 30177 30177 W BpBinder: Slow Binder: BpBinder transact took 7742ms, interface=android.content.IContentProvider, code=1 oneway=false
EventLog标签
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 | |
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 | |
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,Token,TaskID,ComponentName,Reason | |
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 | |
30039 | am_crash | User ,PID ,ProcessName,Flags ,Exception,Message,File,Line | |
30040 | am_wtf | User ,PID ,ProcessName,Flags ,Tag,Message | |
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 |
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)