Android App启动过程

应用程序进程

操作系统中,程序是运行在进程中的,所以如果要运行你的 App ,需要先运行一个 App 所在的进程。

AMS 在启动 App 时会检查这个 App 所需要的应用程序进程是否存在,不存在会请求 Zygote 进程创建一个应用程序进程。

在 Zygote 的启动流程中我们知道,Zygote 进程会创建一个 Socket 接收 AMS 创建应用程序进程的请求,收到请求后 fork 自身来创建一个子进程,这个子进程就是应用程序进程。因为是由 Zygote 进程 fork 而来,会持有虚拟机实例。

在应用程序进程创建的过程中,除了获取虚拟机实例外,还创建了 Binder 线程池和消息循环,这样运行在 应用程序进程中的 App 就可以方便调用 Binder 进行进程间通信以及处理消息了。

应用程序进程启动过程

应用程序进程的启动主要分为两个步骤:

  1. AMS 请求 Zygote 创建应用程序进程

  2. Zygote 接收请求并创建应用程序进程

AMS 请求 Zygote 创建应用程序进程

AMS 调用 startProcessLocked 方法向 Zygote 进程发送请求,内部逻辑是:

  1. 获取要创建的 app 进程用户 ID。

  2. 根据 ID 创建用户组 gids 并赋值。

  3. 检查 entryPoint ,为 null 则赋值为 ActivityThread。

  4. 将 1 – 3 的对象作为参数调用 Process.start 方法启动应用程序进程。

查看 ZygoteState 的 connect 方法:

通过连接到给定的 Zygote Socket 并保存给定的 USAP Socket 地址来创建一个新的 ZygoteState 对象。

Android App启动过程

通过一个本地的 socket.connect 去连接到了 Zygote 进程中的 Socket 。以此建立连接,并返回一个 ZygoteState 类型的对象。

Zygote 接收请求并创建应用程序进程

回顾 ZygoteInit 中的代码逻辑中,通过 zygoteServer.registerServerSocket 方法创建 Socket ,并调用 zygoteServer.runSelectLoop 等待 AMS 请求。

当 AMS 请求到来时,会调用 peers.get(i).runOnce(), 这里 peers 保存的是 ZygoteConnection,在它的 runOnce 中:

  1. 首先获取应用程序进程的启动参数

  2. 然后创建应用程序进程,通过 Zygote fork 而来。

  3. 然后检查当前运行的进程是否是运行在子进程中,若是则调用处理应用程序进程的方法,内部调用到 ZygoteInit.init 方法。

  4. ZygoteInit.init 中的逻辑在 Zygote 章节介绍过,会去创建 Binder 线程池然后调用 RuntimeInit.applicationInit 方法。(和 SystemServer 一样,但是这里是在应用程序进程中。)

  5. 在 RuntimeInit.applicationInit 中,通过反射获取 ActivityThread 类,然后调用 ActivityThread 的 main 方法。

调用到 ActivityThread 的 main 方法时,应用程序进程的创建流程就已经结束了。

在 applicationInit 的最后,通过 findStaticMain 去查找 main 方法:

Android App启动过程

在这个方法中,首先用反射根据 className 获取了 类对象,然后去找它的 mian 方法,最后返回了一个 MethodAndArgsCaller 对象。


Android App启动过程

它的调用栈是:

Android App启动过程

从调用栈看,最后在  ZygoteConnection 中的 handleChildProc 方法中,处理的。最后会在 ZygoteInit 中的 ZygoteServer 获取到 caller 对象,并调用。

ZygoteServer 就是我们用来接收 AMS 的创建应用程序进程的请求的服务端。

接收到创建进程请求后,处理子进程,具体的处理方法就是创建 ActivityThread ,然后开启主线程的 Loop 。

原文始发于微信公众号(八千里路山与海):Android App启动过程

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/60174.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!