如何分析Activity生命週期的log

一、查看log的方向和方式

  1. 涉及到Activity生命週期問題時,主要是查看event log(logcat -b events),本地可使用adb logcat
    -b events | grep am_
  2. 涉及到某個生命週期(一般指am_on_xxx)耗時時,結合"Slow Looper main"查看是哪個消息耗時
  3. 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之後一直很忙(如:某個ui組件有問題導致遞歸繪製)會導致onStop執行延遲,直到10s超時後system_server端主動去執行stop。

所以onStop執行慢基本都是App端的問題,與AMS無關。

  • 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/onDestroy延遲執行

// 這個是正常的按下返回鍵返回上個頁面的流程
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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章