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主界面。
相关推荐
CatShitK13 分钟前
【Android】 如何将 APK 内置为系统应用(适用于编辑设置属性)
android·java·linux
casual_clover16 分钟前
Android 中实现 GIF 图片动画
android
程序员Linc1 小时前
PP-OCR的安卓端部署
android·ocr·pp-ocr·安卓部署
{⌐■_■}1 小时前
【MySQL】索引运算与NULL值问题详解:索引字段应尽量 NOT NULL ,NULL值不能参与部分索引运算
android·数据库·mysql
移动开发者1号3 小时前
System.currentTimeMillis()与elapsedRealtime()区别
android
顾林海3 小时前
Android Retrofit原理解析
android·面试·源码
V少年3 小时前
深入浅出安卓Jetpack组件
android
老码识土3 小时前
Kotlin 协程源代码泛读:Continuation 思想实验
android·kotlin
老码识土3 小时前
Kotlin 协程源代码泛读:async
android·kotlin
划水哥~4 小时前
Activity之间交互
android·kotlin