App的启动流程
冷启动和热启动
冷启动: 当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,然后再根据启动的参数,启动对应的进程组件,这个启动方式就是冷启动。 热启动: 当启动应用时,后台已有该应用的进程,在已有进程的情况下,这种启动会从已有的进程中来启动对应的进程组件,这个方式叫热启动。 所以一句话总结就是,冷启动为应用的进程还没有创建,而热启动应用的进程已经创建,只是在应用里面进行activity的跳转。
一张很重要的图
启动流程分析
1.点击桌面图标,我们的桌面应用也是一个Launcher应用,也是继承自Activity类的,所以冷启动也是从Activity#startActivity开始的,所以如图,Launcher进程通过Binder向system_server进程发起创建进程的请求。
2.system_server进程里面的AMS(负责Activity
管理和调度)会记录Activity的信息,对Activity的启动模式进行处理,解析Intent等等,如果发现应用的进程还没创建,则会向zygote进程发送创建进程的请求。
3.Zygote进程fork出新的子进程,即App进程。(这里在Android10
里做了一个优化,Zygote
进程首先会fork
出多个子进程,相当于说有一个进程池,如果有应用启动,这里直接把子进程转化为应用进程,不用每次在应用启动的时候唤醒Zygote
进程)
4.App进程,通过Binder IPC向sytem_server进程发起attachApplication请求
5.system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求
6.App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息
7.ActivityThread#main()方法,ActivityThread就相当于我们的主线程,是应用程序的入口。在main()方法里对ActivityThread、主线程Handler进行初始化,然后开启消息轮询,创建application并初始化。
8.然后通过主线程Handler,将Activity启动回到主线程中执行,创建Activity实例,初始化Activity,然后调用Activity的生命周期函数,然后在onResume()生命周期之后就开始View的绘制。
一些关键类的介绍
zygote
在Android操作系统中,Zygote
是一个特殊的进程,它是所有Android应用程序进程的起点。当您启动一个新的Android应用程序时,系统会首先启动Zygote
进程,然后Zygote
进程会 fork 出新的应用程序进程。这种机制能够显著缩短应用程序的启动时间,因为Zygote
进程已经预加载了许多常用的类和资源,新的应用程序进程可以直接共享这些资源,继承Zygote进程的内存空间和状态,而不需要重新加载。
以下是Zygote
进程的主要功能和特点:
- 预加载类和资源:
Zygote
进程会在应用程序启动之前预加载一些常用的类和资源,以提高应用程序启动的速度。这些预加载的类和资源通常包括系统类和系统级资源。 - 进程孵化(Forking): 当您启动一个新的Android应用程序时,系统会通过
Zygote
进程 fork 出一个新的应用程序进程。这个新的进程会继承Zygote
进程的状态,包括预加载的类和资源。这种机制被称为进程孵化(process forking)。 - 应用程序隔离: 尽管新的应用程序进程会共享一部分内存和资源,但每个应用程序进程仍然是独立的,它们之间是相互隔离的。这种隔离性确保了应用程序之间的安全性和稳定性。
- 共享内存页:
Zygote
进程使用了共享内存页(shared memory pages)的机制,允许Zygote
和新的应用程序进程在启动时共享一些内存页,这样可以更快地启动新的进程。
总的来说,Zygote
进程在Android系统中起到了一个非常重要的角色,它通过预加载类和资源、进程孵化等机制,加速了Android应用程序的启动过程。
System_server
SystemServer也是一个进程,而且是由zygote进程fork出来的。
系统里面重要的服务都是在这个进程里面开启的,比如ActivityManagerService、PackageManagerService、WindowManagerService,窗口管理、通知管理、传感器服务、电源管理、包管理、设备策略服务等。
ActivityManagerService
ActivityManagerService,简称AMS,服务端对象,负责系统中所有Activity的生命周期。
AMS会维护一个应用程序进程列表,其中包含了所有已经启动的应用程序的信息。
在SystemServer进程开启的时候,就会初始化ActivityManagerService。