Android 应用程序启动优化之冷启动和热启动详解
一、应用程序启动方式
Android 应用程序的启动方式可以分为两种:冷启动和热启动。
1. 冷启动:当启动应用程序时,后台没有该应用程序的进程,这时系统会重新创建一个新的进程分配给该应用程序,这个启动方式就是冷启动。在冷启动中,系统会先创建和初始化 Application 类,再创建和初始化 MainActivity 类(包括一系列的测量、布局、绘制),最后显示在界面上。
2. 热启动:当启动应用程序时,后台已有该应用程序的进程(例如:按 back 键、home 键,应用程序虽然会退出,但是该应用程序的进程是依然会保留在后台,可进入任务列表查看),所以在已有的进程的情况下,这种启动会从已有的进程中来启动应用程序,这个方式叫热启动。在热启动中,因为会从已有的进程中来启动,所以热启动就不会走 Application 这步了,而是直接走 MainActivity(包括一系列的测量、布局、绘制),所以热启动的过程只需要创建和初始化一个 MainActivity 就行了,而不必创建和初始化 Application。
二、应用程序启动过程
冷启动启动流程:
1. 点击应用程序的启动图标时,安卓系统会从 Zygote 进程中 fork 创建出一个新的进程分配给该应用程序。
2. 之后会依次创建和初始化 Application 类、创建 MainActivity 类、加载主题样式 Theme 中的 windowBackground 等属性设置给 MainActivity 以及配置 Activity 层级上的一些属性。
3. 再 inflate 布局、当 onCreate/onStart/onResume 方法都走完了后最后才进行 contentView 的 measure/layout/draw 显示在界面上。
4. 所以,直到这里,应用程序的第一次启动才算完成,这时候我们看到的界面也就是所说的第一帧。
应用程序启动流程大致如下:
1. Application 的构造器方法——>attachBaseContext()——>onCreate()——>Activity 的构造方法——>onCreate()——>配置主题中背景等属性——>onStart()——>onResume()——>测量布局绘制显示在界面上。
热启动流程:
1. 点击桌面图标,Launcher 会启动程序默认的 Activity,之后再按照程序的逻辑启动各种 Activity。
2. 启动 Activity 都需要借助应用程序框架层的 ActivityManagerService 服务进程(Service 也是由 ActivityManagerService 进程来启动的)。
3. 在 Android 应用程序框架层中,ActivityManagerService 是一个非常重要的接口,它不但负责启动 Activity 和 Service,还负责管理 Activity 和 Service。
Step 1. 无论是通过 Launcher 来启动 Activity,还是通过 Activity 内部调用 startActivity 接口来启动新的 Activity,都通过 Binder 进程间通信进入到 ActivityManagerService 进程中,并且调用 ActivityManagerService.startActivity 接口。
Step 2. ActivityManagerService 调用 ActivityStack.startActivityMayWait 来做准备要启动的 Activity 的相关信息。
Step 3. ActivityStack 通知 ApplicationThread 要进行 Activity 启动调度了,这里的 ApplicationThread 代表的是调用 ActivityManagerService.startActivity 接口的进程,对于通过点击应用程序图标的情景来说,这个进程就是 Launcher 了,而对于通过在 Activity 内部调用 startActivity的情景来说,这个进程就是这个 Activity 所在的进程了。
Step 4. ApplicationThread 不执行真正的启动操作,它通过调用 ActivityManagerService.activityPaused 接口进入到 ActivityManagerService 进程中,看看是否需要创建新的进程来启动 Activity。
Step 5. 对于通过点击应用程序图标来启动 Activity,ActivityManagerService 会判断是否需要创建新的进程来启动 Activity。
了解 Android 应用程序的启动过程对于优化应用程序的性能非常重要,可以根据应用程序的启动方式和启动过程来进行相应的优化处理。