应用启动过程(Activity的启动过程)

引言

在上一篇Android应用启动类型介绍文章介绍了Android应用启动的类型和之间的区别,接下来学习Android应用的启动过程,应用的启动过程相对来说代码流程比较繁琐,我认为不必每个代码细节点都要完全了解,化繁为简,抓住几个重要的阶段分析即可。

我的学习路线是从应用启动场景->应用启动的类型->应用启动/退出时的关键log->应用启动过程几个主要进程的交互->应用进程和SystemServer的绑定Activity的生命周期执行到最终显示 这几个阶段学习整个启动流程即可。

常见的应用启动场景

用户角度:桌面点击应用图标启动、最近任务栏打开、应用内部跳转到另外一个应用。
系统角度:四大组件都有可能启动应用(Activity,Service,Broadcast,ContentProvider),其中Activity的启动是用户最直观感受到的。

应用启动类型

冷启动:应用进程和内存未分配,很多实例需要初始化,耗时相对较长。
热启动:应用进程起来,只需要把后台的Activity拉到前台。

应用启动关键LOG

【main_log】07-12 20:15:48.640198   694   694 D Zygote  : Forked child process 22662  //Zygote进程fork子进程(音乐)
【sys_log】07-12 20:15:48.646994  1425  1527 I ActivityManager: Start proc 22662:com.android.music/u0a124 for pre-top-activity {com.android.music/com.android.music.WidgetToTrackActivity}
【event_log】07-12 20:15:48.646851  1425  1527 I am_proc_start: [0,22662,10124,com.android.music,pre-top-activity,{com.android.music/com.android.music.WidgetToTrackActivity}]
【event_log】07-12 20:15:48.666880  1425  1801 I am_proc_bound: [0,22662,com.android.music]
  • 从mainlog里面可以看到Zygote创建了22662这个音乐进程;
  • ActivityManager: Start proc xxxx 打印创建的进程号,应用报名和Userid;
  • for 后面是启动的原因,如activity, pre-top-activity;
  • {com.android.music/com.android.music.WidgetToTrackActivity} 是启动的Activity组件;
  • eventlog可以看到应用进程的创建和绑定过程;

应用退出关键LOG

【main_log】07-12 20:35:22.487515   694   694 I Zygote  : Process 22662 exited due to signal 9 (Killed)
【sys_log】07-12 20:35:22.290965  1425  3341 I ActivityManager: Force stopping com.android.music appid=10124 user=0: stop by com.android.launcher2
【sys_log】07-12 20:35:22.291271  1425  3341 I ActivityManager: Killing 22662:com.android.music/u0a124 (adj 50): stop com.android.music due to stop by com.android.launcher2
【event_log】07-12 20:35:22.291336  1425  3341 I am_kill : [0,22662,com.android.music,50,stop com.android.music due to stop by com.android.launcher2]
【event_log】07-12 20:35:22.293146  1425  3341 I am_destroy_service: [0,140591170,22662]
【event_log】07-12 20:35:22.293356  1425  3341 I am_destroy_service: [0,34946301,22662]
【event_log】07-12 20:35:22.294614  1425  3341 I wm_finish_activity: [0,70896381,83,com.android.music/.MusicMainActivity,proc died without state saved]
【event_log】07-12 20:35:22.300922  1425  1425 I notification_cancel: [10124,22662,com.android.music,1,NULL,0,0,0,8,NULL]
  • mainlog可以看到Zygote打印应用进程退出的原因,例子是signal 9 (Killed);
  • systemlog中看ActivityManager的打印可以查看应用是被谁退出和退出的原因;

应用冷启动的基本流程

以Launcher点击应用图标启动应用这个场景举例,主要的进程和基本调用流程如下图所示:
在这里插入图片描述

  1. Launcher:客户端触发startActivity(Context.startActivity),并进入Pause;
  2. SystemServer:和Zygote交互通知创建进程(Process.start);
  3. Zygote:孵化子进程(Zygote.fork()),加载ActivityThread到Dalvik虚拟机,同时放回PID给SystemServer;
  4. 目标应用进程初始化(完成attach后由AMS管理第一个Activity的生命周期流程);

基本流程如下:
Context.startActivity()—>AMS.startProcess() ----Socket---->Zygote.fork() ---->ActivityThread.main()

结语

本篇主要是对应用的启动流程有个基本的认知,详细的代码调用流程可参考从Launcher开始启动App流程源码分析。看我详细的代码调用过程后,接下里我会总结AMS中和Activity相关的关键类结构和关系。

猜你喜欢

转载自blog.csdn.net/lgglkk/article/details/125752926