引言
在上一篇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点击应用图标启动应用这个场景举例,主要的进程和基本调用流程如下图所示:
- Launcher:客户端触发startActivity(Context.startActivity),并进入Pause;
- SystemServer:和Zygote交互通知创建进程(Process.start);
- Zygote:孵化子进程(Zygote.fork()),加载ActivityThread到Dalvik虚拟机,同时放回PID给SystemServer;
- 目标应用进程初始化(完成attach后由AMS管理第一个Activity的生命周期流程);
基本流程如下:
Context.startActivity()—>AMS.startProcess() ----Socket---->Zygote.fork() ---->ActivityThread.main()
结语
本篇主要是对应用的启动流程有个基本的认知,详细的代码调用流程可参考从Launcher开始启动App流程源码分析。看我详细的代码调用过程后,接下里我会总结AMS中和Activity相关的关键类结构和关系。