Activity 启动流程log分析

文章介绍了如何通过开启debug开关来跟踪Android应用程序的启动过程,包括Activity的生命周期变化,以及如何使用Log打印功能详细记录ActivityRecord和TaskRecord的状态迁移。重点提到了`newThrowable()`方法在追踪调用链中的应用。
摘要由CSDN通过智能技术生成

为了方便跟踪启动过程相关流程,打开debug开关,并添加Log打印

1.Log打点

1)打开debug开关

打开 WindowManagerDebugConfig开关,会打开InputMonitor InputManagerCallback PhoneWindowManager中的input向相关日志打印

public static boolean DEBUG_INPUT = true;

打开Activity中的debug开关,可以直接看到activity生命周期变化

    private static final boolean DEBUG_LIFECYCLE = true;

         if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState);
         if (DEBUG_LIFECYCLE) Slog.v(TAG, "onStart " + this);
         if (DEBUG_LIFECYCLE) Slog.v(TAG, "onResume " + this);
         if (DEBUG_LIFECYCLE) Slog.v(TAG, "onSaveInstanceState " + this + ": " + outState);
         if (DEBUG_LIFECYCLE) Slog.v(TAG, "onSaveInstanceState " + this + ": " + outState +
         if (DEBUG_LIFECYCLE) Slog.v(TAG, "onPause " + this);
         if (DEBUG_LIFECYCLE) Slog.v(TAG, "onStop " + this);
         if (DEBUG_LIFECYCLE) Slog.v(TAG, "onDestroy " + this);
         if (DEBUG_LIFECYCLE) Slog.v(TAG, "onConfigurationChanged " + this + ": " + newConfig);
         if (DEBUG_LIFECYCLE) Slog.v(TAG, "onLowMemory " + this);
         if (DEBUG_LIFECYCLE) Slog.v(TAG, "onTrimMemory " + this + ": " + level);
         if (DEBUG_LIFECYCLE) Slog.v(TAG, "dispatchMultiWindowModeChanged " + this + ": " + isInMultiWindowMode + " " + newConfig);
         if (DEBUG_LIFECYCLE) Slog.v(TAG, "dispatchPictureInPictureModeChanged " + this + ": " + isInPictureInPictureMode + " " + newConfig);

打开ActivityTaskManagerDebugConfig的debug开关,可以查看activity的销毁、调度、释放
    public static boolean DEBUG_ALL_ACTIVITIES = DEBUG_ALL || true;
    public static boolean DEBUG_APP = DEBUG_ALL_ACTIVITIES || false;
    public static boolean DEBUG_IDLE = DEBUG_ALL_ACTIVITIES || false;
    public static boolean DEBUG_RELEASE = DEBUG_ALL_ACTIVITIES || false;

	//ActivityRecord.java
         if (DEBUG_APP) Slog.v(TAG_APP, "Clearing app during destroy for activity " + this);
         if (DEBUG_APP) Slog.v(TAG_APP, "Clearing app during remove for activity " + this);
         if (DEBUG_APP) Slog.v(TAG_APP, "Clearing app during cleanUp for activity " + this);
         if (DEBUG_APP) Slog.v(TAG_APP, "Keeping entry during removeHistory for activity " + this);
	//ActivityTaskSupervisor.java
         if (DEBUG_IDLE) Slog.d(TAG_IDLE, "activityIdleInternal: Callers="  + Debug.getCallers(4));
         if (DEBUG_IDLE) Slogf.i(TAG, "activityIdleInternal(): r=%s, mStartingUsers=%s", r, mStartingUsers);
         if (DEBUG_IDLE) Slog.d(TAG_IDLE, "scheduleIdleTimeout: Callers=" + Debug.getCallers(4));
         if (DEBUG_IDLE) Slog.d(TAG_IDLE, "scheduleIdle: Callers=" + Debug.getCallers(4));
         if (DEBUG_IDLE) Slog.d(TAG_IDLE, "removeTimeoutsForActivity: Callers=" + Debug.getCallers(4));
         if (DEBUG_IDLE) Slog.d(TAG_IDLE, "handleMessage: IDLE_TIMEOUT_MSG: r=" + msg.obj);
         if (DEBUG_IDLE) Slog.d(TAG_IDLE, "handleMessage: IDLE_NOW_MSG: r=" + msg.obj);
	//WindowProcessController.java
         if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Trying to release some activities in " + this);
         if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Abort release; already destroying: " + r);
         if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Not releasing in-use activity: " + r);
         if (DEBUG_RELEASE) Slog.v(TAG_RELEASE, "Destroying " + r  + " in state " + r.getState() + " for reason " + reason);

2)添加Log打印

技巧:new Throwable()方法可以打印当前整个方法的调用链

ActivityRecord运行在system_server进程中,ActivityThread运行在App进程中。两处tag可以查看整个Acitivity的变化过程
//ActivityRecord.java
void setState(State state, String reason) {
Slog.e(TAG_STATES, "wei242.wang State movement: " + this + " from:" + getState()+ " to:" + state + " reason:" + reason,new Throwable());
//ActivityThread.java
public void setState(@LifecycleState int newLifecycleState) {
Slog.e(TAG,"wei242.wang setState newLifecycleState = " + newLifecycleState ,new Throwable());

TaskRecord中可查看record的创建及关联(T/U弃用,需要重新研究Task调用关系

 Lcom/android/server/wm/TaskRecord;->topRunningActivityLocked()Lcom/android/server/wm/ActivityRecord;

ActivityStarter.java

//设置ActivityRecord 和TaskRecord的关系
    /** Places {@link #mStartActivity} in {@code task} or an embedded {@link TaskFragment}. */
    private void addOrReparentStartingActivity(@NonNull Task task, String reason) {
        Slog.d(TAG,"wei242.wang addOrReparentStartingActivity",new Throwable());

ActivityStack(T/U弃用,需要重新研究Task调用关系

注:

参考:https://blog.csdn.net/weixin_42695485/article/details/108632021

本文使用U代码

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值