目录
前言
在 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源码开发揭秘》资料,扫码即可【免费领取】!!