Android Framework之Zygote 进程的启动过程

目录

前言

在 Android 系统中,DVM(Dalvik 虚拟机)和 ART、应用程序进程以及运行系统的关键服务的 SystemServer 进程都是由 Zygote 进程来创建的,我们也将它称为孵化器。它通过fock的形式来创建应用程序进程和SystemServer 进程,下面我们就通过分析代码来看一下Zygote 进程是如何做这些事的。

分析步骤
1.分析ZygoteInit.java的main方法

其实ZygoteInit 的 main 方法主要做了 4 件事:
(1)创建一个 Server 端的 Socket。

(2)预加载类和资源。

(3)启动 SystemServer 进程。

(4)等待 AMS 请求创建新的应用程序进程。

2.分析registerZygoteSocket

我们可以看到主要就是创建 LocalServerSocket,也就是服务器端的 Socket,并将文件操作符作为参数传进去。在 Zygote 进程将 SystemServer 进程启动后,就会在这个服务器端的 Socket 上等待 AMS 请求 Zygote 进程来创建新的应用程序进程。

void registerServerSocket(String socketName) {
        if (mServerSocket == null) {
            int fileDesc;
            final String fullSocketName = ANDROID_SOCKET_PREFIX + socketName;
            try {
                String env = System.getenv(fullSocketName);
                fileDesc = Integer.parseInt(env);
            } catch (RuntimeException ex) {
                throw new RuntimeException(fullSocketName + " unset or invalid", ex);
            }

            try {
                FileDescriptor fd = new FileDescriptor();
                fd.setInt$(fileDesc);
                mServerSocket = new LocalServerSocket(fd);
            } catch (IOException ex) {
                throw new RuntimeException(
                        "Error binding to local socket '" + fileDesc + "'", ex);
            }
        }
    }

3.分析启动 SystemServer 进程

在forkSystemServer函数中我们可以看到,启动SystemServer的一些参数,其中就有SystemServer所在的Java类路径

再往下看,我们发现是通过forkSystemServer来创建SystemServer进程

下面我们再查看handleSystemServerProcess函数

我们看到最后的返回也是调用了一个函数,我们进入ZygoteInit.zygoteInit函数中

我们发现最后又调用了RuntimeInit.applicationInit,我们点进去

我们发现里面又调用了findStaticMain函数,通过函数的名称我们可以猜到,大概是调用main函数的方法

我们进入findStaticMain函数中发现确实是在这里获取main函数,不过最后又创建了一个MethodAndArgsCaller对象

我们查看MethodAndArgsCaller的源码发现这个类实现了Runnable接口,并且在run方法中调用了Method(也就是传进来的main函数)

然后我们再回到ZygoteInit.java文件的main函数中,我们发现forkSystemServer返回的正是Runnable的实现,而且在下面也调用了run方法(即调用了SystemServer的main函数)

然后我们再找到SystemServer.java发现里面确实有main函数,而且启动了SystemServer

4.分析runSelectLoop

runSelectLoop这个函数中的逻辑也就是等待 AMS 请求创建新的应用程序进程。下面的mServerSocket 就是我们在 registerZygoteSocket 函数中创建的服务器端Socket,调用mServerSocket.getFileDescriptor()函数用来获得该 Socket 的 fd 字段的值并添加到 fd 列表 fds 中。接下来无限循环用来等待 AMS 请求 Zygote 进程创建新的应用程序进程。

下面这段代码是通过遍历将 fds 存储的信息转移到 pollFds 数组中。然后对 pollFds 进行遍历,如果 i==0,说明服务器端 Socket 与客户端连接上了,换句话说就是,当前 Zygote进程与 AMS 建立了连接。然后通过 acceptCommandPeer 方法得到 ZygoteConnection类并添加到 Socket 连接列表 peers 中,接着将该ZygoteConnection 的 fd 添加到 fd 列表 fds中,以便可以接收到 AMS 发送过来的请求。如果 i 的值不等于 0,则说明 AMS 向 Zygote进程发送了一个创建应用进程的请求,最后调用 ZygoteConnection 的 runOnce 函数来创建一个新的应用程序进程,并在成功创建后将这个连接从 Socket 连接列表 peers 和fd 列表 fds 中清除。

最后

如果你想要深入系统的学习Android Framework框架,这里可以分享一份《Android Framework源码开发揭秘》,其中记录了从系统启动流程到WMS全部源码解析,相信你能优秀地学习整个Framework框架。

因文章篇幅原因,只放了部分内容,完整版扫码免费领取

《Android Framework源码开发揭秘》

第一章 系统启动流程分析

  • 第一节 Android启动概览
  • 第二节 init.rc解析
  • 第三节 Zygote
  • 第四节 面试题

在这里插入图片描述

第二章 跨进程通信IPC解析

  • 第一节 Sercice 还可以这么理解
  • 第二节 Binder基础
  • 第三节 Binder应用
  • 第四节 AIDL应用(上)
  • 第五节 AIDL应用(下)
  • 第六节 Messenger原理及应用
  • 第七节 服务端回调
  • 第八节 获取服务(IBinder)
  • 第九节 Binder面试题全解析

在这里插入图片描述

第三章 Handler源码解析

  • 第一节 源码分析
  • 第二节 难点问题
  • 第三节 Handler常问面试题
  • 在这里插入图片描述

第四章 AMS源码解析

  • 第一节 引言
  • 第二节 Android架构
  • 第三节 通信方式
  • 第四节 系统启动系列
  • 第五节 AMS
  • 第六节 AMS 面试题解析

在这里插入图片描述

第五章 WMS源码解析

  • 第一节 WMS与activity启动流程
  • 第二节 WMS绘制原理
  • 第三节 WMS角色与实例化过程
  • 第四节 WMS工作原理

在这里插入图片描述

第六章 Surface源码解析

  • 第一节 创建流程及软硬件绘制
  • 第二节 双缓冲及SurfaceView解析
  • 第三节 Android图形系统综述
  • 在这里插入图片描述

第七章 基于Android12.0的SurfaceFlinger源码解析

  • 第一节 应用建立和SurfaceFlinger的沟通的桥梁
  • 第二节 SurfaceFlinger的启动和消息队列处理机制
  • 第三节 SurfaceFlinger 之 VSync(上)
  • 第四节 SurfaceFlinger之VSync(中)
  • 第五节 SurfaceFlinger之VSync(下)
  • 在这里插入图片描述

第八章 PKMS源码解析

  • 第一节 PKMS调用方式
  • 第二节 PKMS启动过程分析
  • 第三节 APK的扫描
  • 第四节 APK的安装
  • 第五节 PKMS之权限扫描
  • 第六节 静默安装
  • 第七节 requestPermissions源码流程解析

在这里插入图片描述

第九章 InputManagerService源码解析

  • 第一节 Android Input输入事件处理流程(1)
  • 第二节 Android Input输入事件处理流程(2)
  • 第三节 Android Input输入事件处理流程(3)

在这里插入图片描述

第十章 DisplayManagerService源码解析

  • 第一节 DisplayManagerService启动
  • 第二节 DisplayAdapter和DisplayDevice的创建
  • 第三节 DMS部分亮灭屏流程
  • 第四节 亮度调节
  • 第五节 Proximity Sensor灭屏原理
  • 第六节 Logical Display和Physical Display配置的更新

在这里插入图片描述

各位小伙伴们如果有需要这份《Android Framework源码开发揭秘》资料,扫码即可【免费领取】!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值