Activity 启动流程log分析

为了方便跟踪启动过程相关流程,打开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
    评论
实验一Android环境构建与Activity生命周期 【目的】 安装智能手机开发相关软件平台,并在此基础上测试Activity的生命周期过程。 【要求】 1. 完成智能手机开发平台安装、以及相关配置; 2. 并实现Hello World; 3. 添加Log日志,通过Log日志验证Activity生命周期中的7个方法执行过程; 4. 了解项目的基本文件目录结构,了解Activity周期中的4种状态。 【过程】 (1)建立新项目,实现Hello World; 1)打开Eclipse,选择File -> New -> Android Project. 2)填写project name(helloword),然后选择选择build target(Android 2.1),填写Application name(helloword),Package name(your.helloword)完成创建。 3)运行结果如下图: (2)设置生命周期的Log日志,分别执行相关操作 在hellowordActivity.java文件中依次添加回调函数,分别在各个方法中添加日志监 视语句,复写函数。添加代码如下: package your.helloword; import android.app.Activity; import android.os.Bundle; import android.util.Log; public class HellowordActivity extends Activity { /** Called when the activity is first created. */ private static String TAG="helloword";//设置过滤关键字helloword @Override //完全生命周期开始时被调用,初始化activity public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Log.i(TAG,"(1) onCreate()");} @Override //可视生命周期开始时被调用,对用户界面进行必要的更改 public void onStart() { super.onStart(); Log.i(TAG,"(2) onStart()");} @Override //在活动生命周期开始时被调用,恢复被onPause()停止的用于界面更新的资源 public void onResume() { super.onResume(); Log.i(TAG,"(3) onResume()");} @Override //在重新进入可视生命周期前被调用,载入界面所需要的更改信息 public void onRestart() { super. onRestart(); Log.i(TAG,"(4) onRestart()");} @Override //在活动生命周期结束时被调用,用于保存持久的数据或释放占用的资源 public void onPause() { super.onPause(); Log.i(TAG,"(5) onPause()");} @Override //在可视生命周期结束时被调用,用于保存持久的数据或释放占用的资源 public void onStop() { super.onStop(); Log.i(TAG,"(6) onStop()");} @Override //在完全生命周期结束时被调用,释放资源,包括线程、数据连接等 public void onDestroy() { super.onDestroy(); Log.i(TAG,"(7) onDestroy()");} }     程序运行结果将会显示在Logcat中,打开程序,在LogCat的输出日志中检查输出情况, 执行顺序onCreate()、onStart()、onResume()。运行结果如下: 按下back键,在LogCat的输出日志中检查输出情况,执行顺序onPause()、onStop() 、onDestory()。运行结果如下: 按下home键,在LogCat的输出日志中检查输出情况,执行顺序onPause()、onStop( ); 再启动HelloWorld,在LogCat的输出日志中检查输出情况,执行顺序是onRestart()、 onStart()、onResume(); 实验心得 本次实验目的是学会安装智能手机开发相关软件平台,并在此基础上测试Activity的生命 周期过程。通过本次实验,了解了a

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值