详细的Log打印可以看Activity 启动流程log分析
关于Activity的debug,android里面已经提供了2个debug文件
frameworks/base/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerDebugConfig.java
1. ActivityManagerDebugConfig
里面提供了如下debug开关,可以根据实际需求来打开对应的开关,其中DEBUG_ALL是打开所有开关,对应的TAG是ActivityManager,列举了几个重要的debug开关
// Default log tag for the activity manager package.
static final String TAG_AM = "ActivityManager";
// Enable all debug log categories.
static final boolean DEBUG_ALL = false;
// Available log categories in the activity manager package.
static final boolean DEBUG_ANR = false;
static final boolean DEBUG_BACKGROUND_CHECK = DEBUG_ALL || false;
// broadcast相关的log
static final boolean DEBUG_BROADCAST = DEBUG_ALL || false;
// provider相关的log
static final boolean DEBUG_PROVIDER = DEBUG_ALL || false;
// service相关的log
static final boolean DEBUG_SERVICE = DEBUG_ALL || false;
里面提供的Log已经可以满足大部分的debug需求了,方便跟踪相关的流程。如果想打印Activity的生命周期的相关,则需要另外选择debug点
2. ActivityTaskManagerDebugConfig
这个类里面,提供了所有和Activity相关的debug开关
// Default log tag for the activities.
static final String TAG_ATM = "ActivityTaskManager";
// Enable all debug log categories.
static final boolean DEBUG_ALL = false;
// Enable all debug log categories for activities.
private static final boolean DEBUG_ALL_ACTIVITIES = DEBUG_ALL || false;
static final boolean DEBUG_ADD_REMOVE = DEBUG_ALL_ACTIVITIES || false;
public static final boolean DEBUG_CONFIGURATION = DEBUG_ALL || false;
static final boolean DEBUG_CONTAINERS = DEBUG_ALL_ACTIVITIES || false;
static final boolean DEBUG_FOCUS = false;
static final boolean DEBUG_IMMERSIVE = DEBUG_ALL || false;
static final boolean DEBUG_LOCKTASK = DEBUG_ALL || false;
static final boolean DEBUG_PAUSE = DEBUG_ALL || false;
static final boolean DEBUG_RECENTS = DEBUG_ALL || false;
static final boolean DEBUG_RECENTS_TRIM_TASKS = DEBUG_RECENTS || false;
static final boolean DEBUG_SAVED_STATE = DEBUG_ALL_ACTIVITIES || false;
static final boolean DEBUG_STACK = DEBUG_ALL || false;
static final boolean DEBUG_STATES = DEBUG_ALL_ACTIVITIES || false;
public static final boolean DEBUG_SWITCH = DEBUG_ALL || false;
static final boolean DEBUG_TASKS = DEBUG_ALL || false;
static final boolean DEBUG_TRANSITION = DEBUG_ALL || false;
static final boolean DEBUG_VISIBILITY = DEBUG_ALL || false;
static final boolean DEBUG_APP = DEBUG_ALL_ACTIVITIES || false;
static final boolean DEBUG_IDLE = DEBUG_ALL_ACTIVITIES || false;
static final boolean DEBUG_RELEASE = DEBUG_ALL_ACTIVITIES || false;
static final boolean DEBUG_USER_LEAVING = DEBUG_ALL || false;
static final boolean DEBUG_PERMISSIONS_REVIEW = DEBUG_ALL || false;
static final boolean DEBUG_RESULTS = DEBUG_ALL || false;
public static final boolean DEBUG_CLEANUP = DEBUG_ALL || false;
public static final boolean DEBUG_METRICS = DEBUG_ALL || false;
其中 DEBUG_STATES 开关可以打印Activity的所有生命周期变化,在ActivityRecord类里面,文件路径如下:
frameworks/base/services/core/java/com/android/server/wm/ActivityRecord.java
其中setState方法会打印生命周期变化及原因
void setState(ActivityState state, String reason) {
if (DEBUG_STATES) Slog.v(TAG_STATES, "State movement: " + this + " from:" + getState()
+ " to:" + state + " reason:" + reason);
}
通过adb logcat命令过滤ActivityTaskManager,START u代表启动了一个应用,对把Log打印和现象的时间点对上有很大的帮助
08-22 19:30:25.743 1350 1450 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.android.dialer/.main.impl.MainActivity bnds=[637,1133][839,1345] (has extras)} from uid 10103