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。

相关推荐
愤怒的代码几秒前
Spring Boot中幂等性的应用
java·spring boot·后端
silver6871 分钟前
JAVA8 Stream API 使用详解
java
武子康4 分钟前
大数据-259 离线数仓 - Griffin架构 修改配置 pom.xml sparkProperties 编译启动
xml·java·大数据·hive·hadoop·架构
天天打码41 分钟前
ThinkPHP项目如何关闭runtime下Log日志文件记录
android·java·javascript
魔道不误砍柴功1 小时前
Java 中反射的高级用法:窥探 Java 世界的魔法之门
java·开发语言·python
P7进阶路1 小时前
实现用户登录系统的前后端开发
java
2401_857617621 小时前
“无缝购物体验”:跨平台网上购物商城的设计与实现
java·开发语言·前端·安全·架构·php
事业运财运爆棚1 小时前
7种server的服务器处理结构模型
java·linux·服务器
上海运维Q先生1 小时前
面试题整理13----deployment和statefulset区别
运维·面试·kubernetes
西岭千秋雪_1 小时前
设计模式の中介者&发布订阅&备忘录模式
java·观察者模式·设计模式·中介者模式·备忘录模式