Android Framework(一)--对Zygote的理解
目录
zygote的作用
zygote的启动流程
问题:启动进程有几种方式?
问题:Zygote进程启动之后做了什么?
(一)先执行native函数
(二)切换到java后
问题:Zygote fork为什么要单线程执行
Zygote的工作原理
问题:Zygote的IPC通信为什么不采用Binder?如果采用Binder的话会有什么问题?
问题:孵化应用进程为什么不交给SystemServer?而是专门设计一个Zygote?
zygote启动总结:
zygote的作用
- 启动SystemServer
系统服务进程SystemServer是由Zygote进程fork出的(系统中比较重要的ActivityManagerService、PackageManagerService,WindowManagerService以及PowerManagerService等也是由SystemServer进程创建而来的),fork出的SystemServer进程会继承Zygote的资源,比如:常用类、JNI函数、主题资源、共享库等。
2.孵化应用进程
参考android的启动流程 , 里面有一个方法zygoteSendArgsAndGetResult
方法,就是AMS请求Zygote来创建新的应用程序进程的。
补充 :
启动三段式(独立进程都符合) : 进程启动->准备工作->LOOP(接收/处理)
zygote的启动流程
init进程是Linux进程的第一个进程,它会加载启动配置文件init.rc。init.rc包含了众多的系统配置服务,里面就包含了要启动Zygote进程的配置
采用fork+execve模式启动,pid为0是子进程;默认情况,创建子进程是继承了父进程的系统资源,但是调用了execve系统调用去加载另一个二进制程序的话,继承的父进程的系统资源就会被替换成加载的二进制程序
问题:启动进程有几种方式?
两种 : fork+handle / fork+execve
流程:
- 调用fork()函数
- 判断pid是不是等于0来确定当前进程是父进程还是子进程
补充:
- 父子进程判断:fork()函数获取pid,父进程返回的是子进程的pid,
- 信号处理--SIGCHLD : 父进程fork出子进程,如果子进程挂了,父进程会收到sigchld信号, 比如zygote进程挂了,init进程收到信号会重启zygote进程
问题:Zygote进程启动之后做了什么?
(一)先执行native函数
启动Android虚拟机->注册AndroidJNI函数->切换到java
主要:在app_main.cpp中执行main()函数,内部执行JNI_CreateJavaVM()创建虚拟机
补充:
创建虚拟机的位置在:
AndroidRuntime.cpp
中的startVm
方法来启动虚拟机,startReg
来注册JNI函数,CallStaticVoidMethod(startClass, startMeth, strArray)
来调用ZygoteInit
类的main方法,启动java部分。
注意:
应用程序的虚拟机是继承Zygote进程的,然后再重置虚拟机的状态,再重启下虚拟机。
(二)切换到java后
- Preload Resources:为fork子进程时提供相关的类,主题相关的资源,共享库
- fork后,启动SystemServer
- 启动loop循环, 等待socket消息, 使用socket与SystemServer进行通信
用于AMS通信,参考android启动流程中的ZygoteState.connect(mSocket),这里会创建Socket链接,在接受到AMS跨进程发过来的消息后,会调用handleChildProc启动ActivityThread.main()方法,进入新的进程了
问题:Zygote fork为什么要单线程执行
Zygote里面有很多其他线程,为了保证状态一致,在fork子进程的时候,会停掉其他线程,在fork完成后,再恢复。可以理解为fork只能拷贝当前线程,不支持多线程的fork
Zygote的工作原理
问题:Zygote的IPC通信为什么不采用Binder?如果采用Binder的话会有什么问题?
Zygote的IPC通信使用的是Socket
Zygote的mian方法中会创建一个server端Socket(LocalSocket\LocalServerSocket),用于等待AMS请求Zygote来创建新的应用程序进程的,并且封装了TCP/IP协议,去掉网络相关。
原因:
- 为了避免父亲进程死锁、状态不一致等其他多线程问题,如果采用binder,在父进程binder线程有锁,然后子进程的主线程一直在等其子线程的资源,但是其实父进程的子进程并没有被拷贝过来,造成死锁,所以fork流程不允许存在多线程。而Binder通信是多线程的。
- 对于Zygote和SystemServer而言,Socket更加简单便捷,也符合单线程规范。
注意:
binder线程的初始化是在ServiceManger初始化的,而ServiceManger是Init进程孵化的,比Zygote进程更早,所以就不存在先后顺序问题。
问题:孵化应用进程为什么不交给SystemServer?而是专门设计一个Zygote?
因为效率问题,SystemServer里面会跑一些其他的服务,如果SystemServer来fork进程,可能造成资源污染,不适合继承。而Zygote进程专门设计来干这事的。
zygote启动总结
- init进程fork出zygote进程
- 启动虚拟机, 注册JNI函数
- 预加载系统资源
- 启动SystemServer
- 启动Socket Loop, 等待socket消息
Android Framework(一)--对Zygote的理解相关推荐
- Android Framework 初理解
概述 其实我们写的App并不是一个完整的程序.我们写的只是一个套件组,就是一堆Activity,Service等等的组件.这个套件组给Framework框架组合在一起才是一个完整的程序.在这里先说一个 ...
- 如何调试Android Framework?
Linus有一句名言广为人知:Read the fucking source code. 但其实,要深入理解某个软件.框架或者系统的工作原理,仅仅「看」代码是远远不够的.就拿Android Frame ...
- Android 系统(78)---《android framework常用api源码分析》之 app应用安装流程
<android framework常用api源码分析>之 app应用安装流程 <android framework常用api源码分析>android生态在中国已经发展非常庞大 ...
- Android FrameWork(AMS,WMS,PMS等)的概念及解析,获取系统服务
Framework API: Activity Manager/Window Manager/Content Providers/View System/Notification Manager/Pa ...
- 鹅厂流出两份Android Framework技术宝典火了,完整版 PDF 限时开放下载
前言 最近互联网大厂的"裁员潮"愈演愈烈-- 如何破局?我想最重要的一点:不断提升个人价值. Android Framework的重要性 Android Framework 开发虽 ...
- Android Framework开发大揭秘!从小白到大佬的进阶之路
听到有些Android开发工程师说去面试腾讯的时候,面试官上来就问: 安卓的系统架构了解吗? 有没有过Framework的开发经验? 由此可见,Framework在Android开发中占着举足轻重的地 ...
- Android Framework学习目录
Android 第一个用户进程:Init进程(概述) Zygote进程以及其初始化 Zygote 启动应用程序 Android SystemServer 进程 关于 PackageManagerSer ...
- 对zygote的理解
一. zygote的作用 启动SystemServer SystemServer需要用于zygote准备好的一些系统资源,比如常用类.注册的JNI函数.主题资源.共享库等等,直接从zygote那继承过 ...
- 专题总纲目录 Android Framework 总纲
专题总纲说明: 本系列文章虽说是 Android 的知识体系专题,同时也是学习Android Framework 系统的一个思路,尤其是当我们对Android 框架层 一点都不了解的时候,但前提是要有 ...
最新文章
- Zookeeper 安装和配置
- 调整linux的时钟
- 阿里巴巴分布式服务框架 Dubbo 团队成员梁飞专访
- rules不显示 vue_使用stylelint规范vue项目
- SAP用户增强总结-采购订单建立增加客户数据增强示例
- opengl加载显示3D模型UC类型文件
- Redis的主从搭建
- Oracle基于布尔的盲注总结
- PPTV Docker集群的网络方案选型
- iOS WKWebView和JS交互的两种方式
- 无线网络技术学习总结
- vue项目中引入字体图标库(傻瓜式教程,详解)
- 脚本自动化互相阅读文章教程
- vbscript mysql_vbscript 数据库操作
- vue+element项目,升级element后带tabs模块的页面。导致页面崩溃白屏问题?
- linux 源码 调试,Linux基础-源代码编译和调试.ppt
- 关于香港高防IP需要关注的几个问题
- GM300写频软件的使用
- 《极光征文》颁奖 | 恭喜你完成 2019 第一个小目标
- 《炒股的智慧》第5节文摘
热门文章
- MySQL数据库笔记小结一
- 生成器、迭代器、可迭代对象
- 单片机中0x00和0x01有什么区别
- 第三方设置cookie提示Mark cross-site cookies as Secure to allow setting them in cross-site contex
- blastFoam水下爆炸数值仿真计算
- (1)goland下载安装+示例代码运行
- 7道腾讯算法编程真题,你能做对几道?包含一道趣味题
- 卫星定位基础理论之GPS信号及其导航电文
- 独立开发变现周刊(第65期): 个人爱好发展成一项36万美元/年的NFTs业务
- elementUI 表格多选框this.$refs.xxx.toggleRowSelection无效