App的启动流程

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进程的主要功能和特点:

  1. 预加载类和资源: Zygote进程会在应用程序启动之前预加载一些常用的类和资源,以提高应用程序启动的速度。这些预加载的类和资源通常包括系统类和系统级资源。
  2. 进程孵化(Forking): 当您启动一个新的Android应用程序时,系统会通过Zygote进程 fork 出一个新的应用程序进程。这个新的进程会继承Zygote进程的状态,包括预加载的类和资源。这种机制被称为进程孵化(process forking)。
  3. 应用程序隔离: 尽管新的应用程序进程会共享一部分内存和资源,但每个应用程序进程仍然是独立的,它们之间是相互隔离的。这种隔离性确保了应用程序之间的安全性和稳定性。
  4. 共享内存页: Zygote进程使用了共享内存页(shared memory pages)的机制,允许Zygote和新的应用程序进程在启动时共享一些内存页,这样可以更快地启动新的进程。

总的来说,Zygote进程在Android系统中起到了一个非常重要的角色,它通过预加载类和资源、进程孵化等机制,加速了Android应用程序的启动过程。

System_server

SystemServer也是一个进程,而且是由zygote进程fork出来的。

系统里面重要的服务都是在这个进程里面开启的,比如ActivityManagerService、PackageManagerService、WindowManagerService,窗口管理、通知管理、传感器服务、电源管理、包管理、设备策略服务等。

ActivityManagerService

ActivityManagerService,简称AMS,服务端对象,负责系统中所有Activity的生命周期

AMS会维护一个应用程序进程列表,其中包含了所有已经启动的应用程序的信息。

在SystemServer进程开启的时候,就会初始化ActivityManagerService。

相关推荐
尚学教辅学习资料11 分钟前
基于微信小程序的电商平台+LW示例参考
java·微信小程序·小程序·毕业设计·springboot·电商平台
尘浮生13 分钟前
Java项目实战II基于微信小程序的移动学习平台的设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·学习·微信小程序·小程序
2401_8576100344 分钟前
Spring Boot框架:电商系统的技术优势
java·spring boot·后端
希忘auto1 小时前
详解MySQL安装
java·mysql
冰淇淋烤布蕾1 小时前
EasyExcel使用
java·开发语言·excel
拾荒的小海螺1 小时前
JAVA:探索 EasyExcel 的技术指南
java·开发语言
Jakarta EE2 小时前
正确使用primefaces的process和update
java·primefaces·jakarta ee
马剑威(威哥爱编程)2 小时前
哇喔!20种单例模式的实现与变异总结
java·开发语言·单例模式
用户3157476081352 小时前
成为程序员的必经之路” Git “,你学会了吗?
面试·github·全栈
java—大象2 小时前
基于java+springboot+layui的流浪动物交流信息平台设计实现
java·开发语言·spring boot·layui·课程设计