Android源码之App启动

目录

App启动概述

App启动过程

App启动过程图

源码概述

跨进程启动

进程内启动


下面以应用桌面Launcher启动App的MainActivity来举例:

App启动概述

首先,MainActivity是由Launcher组件来启动的,而Launcher又是通过Activity管理服务ActivityManagerService(AMS)来启动MainActivity组件的。由于MainActivity组件和Launcher组件,以及AMS是三个不同的进程, 所以这三个不同的进程只能通过 Binder进程间通信机制来完成MainActivity组件的启动过程。

App启动过程

  1. Launcher组件向AMS发送一个启动MainActivity组件进程间通信请求。
  2. AMS首先要将启动MainActivity的信息保存起来,然后向Launcher发送一个中止状态的进程间通信请求。
  3. Launcher组件进入到中止状态以后,会向AMS发送一个已经进入了中止状态的进程间通信请求,以便 AMS可以继续执行启动 MainActivity组件的操作。
  4. AMS如果发现启动MainActivity进程不存在,就会创建一个新的应用程序进程。
  5. 新的应用程序进程启动后,就会向AMS发送一个启动完成的进程间通信请求,以便 AMS可以继续执行启动MainActivity组件的操作。
  6. AMS将第二步保存下来的MainActivity的信息发送到第四步启动创建的应用程序进程,以便它可以将MainActivity组件启动起来。

App启动过程图

源码概述

跨进程启动

  1. 当前进程请求AMS:当前进程采用Binder IPC向system_server进程(AMS)发起startActivity请求;
  2. AMS发送创建应用进程请求:system_server进程接收到请求后,向zygote进程发送创建进程的请求;
  3. Zygote进程接受请求并fork应用进程,即App进程;
  4. App进程通过Binder向AMS发起attachApplication请求,AMS绑定ApplicationThread;
  5. AMS发送启动Activity请求:system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;
  6. ActivityThread的Handler处理启动Activity请求:App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程(ActivityThread)发送LAUNCH_ACTIVITY消息;
  7. 主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate、onResume等方法,UI渲染结束后便可以看到App主界面。

进程内启动

  1. 当前进程请求AMS;
  2. AMS发送启动Activity请求:system_server进程接收到请求后,解析Activity信息、处理启动参数,并给当前进程发送 scheduleLaunchActivity请求;
  3. ActivityThread的Handler处理启动Activity请求:App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程(ActivityThread)发送LAUNCH_ACTIVITY消息;
  4. 主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate、onResume等方法,UI渲染结束后便可以看到App主界面。
相关推荐
Monkey-旭11 分钟前
深入理解 Kotlin Flow:异步数据流处理的艺术
android·开发语言·kotlin·响应式编程·flow
不想迷路的小男孩2 小时前
Android Studio怎么显示多排table,打开文件多行显示文件名
android·ide·android studio
giaoho7 小时前
Android 系统架构
android·系统架构
m0_6593940010 小时前
常见的cms框架的webshell方法
android
fatiaozhang952711 小时前
中兴云电脑W101D2-晶晨S905L3A-2G+8G-安卓9-线刷固件包
android·网络·电脑·电视盒子·刷机固件·机顶盒刷机
IT乐手12 小时前
java 或 安卓项目中耗时统计工具类
android·java
wang_hao..12 小时前
Day4.AndroidAudio初始化
android·音频
维尔切12 小时前
Linux中ssh远程登录原理与配置
android·linux·ssh
louisgeek13 小时前
Android Media3 PlayerView 监听 SurfaceTextureListener
android
广煜永不挂科14 小时前
Android Studio关于Connection refused: connect报错
android·ide·android studio