Android 源码阅读笔记
2023-09-27 14:29:19 时间
Zygote:
1、Zygote 是系统启动之后创建的第二个进程
2、Zygote 创建zygote Socket、虚拟机
3、Zygote 在虚拟机中通过forkSystemServer, 创建Server进程, 并且在其中启动服务(AMS、PMS等)
4、Zygote 在虚拟机中注册zygote套接字,循环监听AMS的请求,创建新的进程
Server: (PS:版本不同,创建服务的方法也有很大不同,以下为5.1.1版本)
1、Zygote fork自己,为Server创建新的子进程之后,调用handleSystemServerProcess 来启动服务
2、handleSystemServerProcess 方法接着调用了 invokeStaticMain方法启动了SystemServer的main方法
3、在main方法中,调用 SystemServer 的run方法
4、其中的 startBootstrapServices 、 startCoreServices 、startOtherServices 分别用来启动不同的服务(AMS、PMS、WMS、CS等)
应用程序进程的创建:
例如:启动一个新的App,或者在另外进程的Activity、Servicec
1、ActivityManagerService创建Activity时,如果它所在的进程不存在,则调用startProcessLocked创建新的进程
2、依次调用方法Process.start、 Process.statViaZygote、Process.openZygoteSocketIfNeeded、Process.zygoteSendArgsAndGetResult;
3、在zygoteSendArgsAndgetResult中使用套接字连接到Zygote进程的LocalSocket,并且将创建进程的指令写入;并且读取创建进程成功后的pid
在Zygote进程中
1、runSelectLoop方法中循环监听套接字
2、收到指令,调用runOnce方法处理请求
3、在runOnce中调用Zygote.forkAndSpecialize方法来创建进程,然后调用handleChildProc启动进程。
4、最终调用ZygoteInit.invokeStaticMain方法,启动ActivityThread的main方法
Binder线程池的启动:
1、进程创建成功依次调用zygoteInit、nativeZygoteInit、com_android_internal_os_RuntimeInit_nativeZygoteInit、onZygoteInit(位于AppRuntime 中)
2、Zygote进程启动的时候,会在进程中创建一个AppRuntime对象,故每一个新创建的进程都有一个该对象
3、onZygoteInit 中, 使用ProcessState中的startThreadPool启动Binder线程池
消息循环的建立:
1、进程创建成功之后,会使用invokeStaticMain方法调用ActivityThread的main方法
2、通过抛出异常MethodAndArgsCaller,在ZygoteInit.main方法的异常捕获中执行反射调用main方法
小结:
1、Zygote是一个进程,它有自己的虚拟机
2、AMS、WMS、PMS等在一个进程,运行在虚拟机中,由Zygote创建
3、Zygote 用来接收AMS的指令,创建新的进程
4、通过脚本启动init进程
5、init进程中fork出一个子进程zygote
6、在zygote进程中创建虚拟机
7、在zygote的虚拟机中创建创建服务进程(Zygote.forkSystemServer--》Zygote.nativeForkSystemServer)
8、在服务进程中启动服务:ZygoteInit.handleSystemServerProcess-->RuntimeInit.zygoteInit方法启动binder线程池(启动SystemServer.main、启动AMS、WMS等)
9、在zygote虚拟机中启动循环监听本地zygote套接字
10、zygote进程,接收到创建进程的命令,通过Zygote.forkAndSpecialize-->Zygote.nativeForkAndSpecialize创建进程;创建之后通过ZygoteConnection.handleChildProc--》RuntimeInit.zygoteInit(创建Binder线程池、调用ActivityThread.main)
11、RuntimeInit.zygoteInit会根据传入的参数不同,启动不同的类的main方法,来实现不同的功能,相同点是它都会创建一个binder线程池, 所以不管是服务进程还是应用程序进程都包含有binder线程池,都可以通过binder进行进程间通讯。
相关文章
- Android RecyclerVIew 列表实现 编辑、单选、全选、删除、动画效果(附源码)
- android源码
- android 服务器
- Android Jetpack系列--1.Lifecycle使用及源码解析
- 快速集成华为AGC云存储服务-Android
- 《Android 源码设计模式解析与实战》——第2章,第2.2节单例模式的定义
- 《Android 源码设计模式解析与实战》——第2章,第2.4节单例模式UML类图
- 《深入解析Android 虚拟机》——第1章 获取并编译Android源码 1.1获取Android源码
- Android View体系(八)从源码解析View的layout和draw流程
- Android实现定时器的方法
- Android 仿PhotoShop调色板应用(二) 透明度绘制之AlphaPatternDrawable
- Android在OnCreate中获取控件的宽度和高度
- macOS Android Studio 如何设置Emulator模拟器独立运行
- Android教程之Android Compose 中实现类似链接反应弹出窗口的弹出窗口(教程含源码)
- Android实现佩戴安全帽检测和识别(含Android源码)
- 行人检测和人脸检测和人脸关键点检测(C++/Android源码)
- Android渗透测试虚拟机环境(VM)—AppUse
- Android View体系(六)从源码解析Activity的构成
- Android事件总线(二)EventBus3.0源码解析
- [LeetCode] 351. Android Unlock Patterns 安卓解锁模式
- Android MIFARE NFCA源码解析