第 3 章 应用程序进程启动过程

本文深入解析应用程序进程的启动流程,从AMS发送启动请求到Zygote进程创建应用程序进程,涵盖Binder线程池与消息循环的创建,是理解Android应用程序运行机制的基础。

应用程序选程简介
要想启动一个应用程序,首先要保证这个应用程序所需要的应用程序进程已经启动。 AMS 在启动应用程序时会检查这个应用程序需要的应用程序进程是否存在,不存在就会请 求 Zygote 进程启动需要的应用程序进程。在 2.2 节中,我们知道在 Zygote 的 Java 框架层 中会创建一个 Se凹er 端的 Socket,这个 Socket 用来等待 AMS 请求 Zygote 来创建新的应用 程序进程。Zygote 进程通过 fock 自身创建应用程序进程,这样应用程序进程就会获得 Zygote 进程在启动时创建的虚拟机实例。当然,在应用程序进程创建过程中除了获取虚拟机实例 外,还创建了 Binder 线程地和消息循环,这样运行在应用进程中的应用程序就可以方便地 使用 Binder 进行进程间通信以及处理消息了。

应用程序进程启动过程介绍
应用程序进程创建过程的步骤比较多, 这里分为两个部分来讲解, 分别是 AMS 发送 启动应用程序进程请求,以及 Zygote 接收请求并创建应用程序进程。

AMS 发送启动应用程序进程请求
这里先给出 AMS 发送启动应用程序进程请求过程的时序图,然后对每一个步骤进行 详细分析

Zygote 接收请求并创建应用程序进程
Zygote 接收请求井创建应用程序进程的时序图如图
在这里插入图片描述
Binder 线程池启动过程
AppRun ne 继承 自 AndroidRuntime, AppRuntime 创建时就会调用 AndroidRuntime 的 构造函数, gCurRuntime 就会被初始化,它指向的是 AppRuntime, 我们来查看 AppRuntime 的 onZygotelnit 函数, AppRuntime 在叩p_main.cpp 中实现,最后一行会调用 ProcessState 的 startThreadPool 函数来启动 Binder 线程地。
支持 Binder 通信的进程中都有一个 ProcessState 类 ,它里面有一个 mThreadPoo!Started 变量,用来表示Binder线程池是否已经被启动过,默认值为 false。在每次调用 startThreadPool
76
第 3 章应用程序进程启动过程
函数时都会在注释 l 处先检查这个标记,从而确保 Binder 线程地只会被启动一次。如果 Binder 线程;也未被启动, 贝Jj 在注释 2 处设置 mThreadPoolStarted 为 true , 并调用 spawnPooledThread 函数来创建线程池中的第一个线程,也就是线程池的主线程

消息循环创建过程

小结
开发人员了解自己所开发的应用的进程是如何创建的是 十分必要的。本章以第 2 章为基础,同时又是第 4 章的基础,起着承上启下的作用。在 3.3 和 3.4 节我们学习了 Binder 线程池和消息循环是如何创建的,它们是进程和线程间通信的 重要手段,其中 3.4 节讲到的 H 类,更是第 4 章、第 5 章将会经常提到的类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值