目录

zygote的作用

zygote的启动流程

问题:启动进程有几种方式?

问题:Zygote进程启动之后做了什么?

(一)先执行native函数

(二)切换到java后

问题:Zygote fork为什么要单线程执行

Zygote的工作原理

问题:Zygote的IPC通信为什么不采用Binder?如果采用Binder的话会有什么问题?

问题:孵化应用进程为什么不交给SystemServer?而是专门设计一个Zygote?

zygote启动总结:


zygote的作用

  1. 启动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

流程:

  1. 调用fork()函数
  2. 判断pid是不是等于0来确定当前进程是父进程还是子进程

补充:

  1. 父子进程判断:fork()函数获取pid,父进程返回的是子进程的pid,
  2. 信号处理--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后

  1. Preload Resources:为fork子进程时提供相关的类,主题相关的资源,共享库
  2. fork后,启动SystemServer
  3. 启动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协议,去掉网络相关。

原因:

  1. 为了避免父亲进程死锁、状态不一致等其他多线程问题,如果采用binder,在父进程binder线程有锁,然后子进程的主线程一直在等其子线程的资源,但是其实父进程的子进程并没有被拷贝过来,造成死锁,所以fork流程不允许存在多线程。而Binder通信是多线程的。
  2. 对于Zygote和SystemServer而言,Socket更加简单便捷,也符合单线程规范。

注意:

binder线程的初始化是在ServiceManger初始化的,而ServiceManger是Init进程孵化的,比Zygote进程更早,所以就不存在先后顺序问题。

问题:孵化应用进程为什么不交给SystemServer?而是专门设计一个Zygote?

因为效率问题,SystemServer里面会跑一些其他的服务,如果SystemServer来fork进程,可能造成资源污染,不适合继承。而Zygote进程专门设计来干这事的。

zygote启动总结

  1. init进程fork出zygote进程
  2. 启动虚拟机, 注册JNI函数
  3. 预加载系统资源
  4. 启动SystemServer
  5. 启动Socket Loop, 等待socket消息

Android Framework(一)--对Zygote的理解相关推荐

  1. Android Framework 初理解

    概述 其实我们写的App并不是一个完整的程序.我们写的只是一个套件组,就是一堆Activity,Service等等的组件.这个套件组给Framework框架组合在一起才是一个完整的程序.在这里先说一个 ...

  2. 如何调试Android Framework?

    Linus有一句名言广为人知:Read the fucking source code. 但其实,要深入理解某个软件.框架或者系统的工作原理,仅仅「看」代码是远远不够的.就拿Android Frame ...

  3. Android 系统(78)---《android framework常用api源码分析》之 app应用安装流程

    <android framework常用api源码分析>之 app应用安装流程 <android framework常用api源码分析>android生态在中国已经发展非常庞大 ...

  4. Android FrameWork(AMS,WMS,PMS等)的概念及解析,获取系统服务

    Framework API: Activity Manager/Window Manager/Content Providers/View System/Notification Manager/Pa ...

  5. 鹅厂流出两份Android Framework技术宝典火了,完整版 PDF 限时开放下载

    前言 最近互联网大厂的"裁员潮"愈演愈烈-- 如何破局?我想最重要的一点:不断提升个人价值. Android Framework的重要性 Android Framework 开发虽 ...

  6. Android Framework开发大揭秘!从小白到大佬的进阶之路

    听到有些Android开发工程师说去面试腾讯的时候,面试官上来就问: 安卓的系统架构了解吗? 有没有过Framework的开发经验? 由此可见,Framework在Android开发中占着举足轻重的地 ...

  7. Android Framework学习目录

    Android 第一个用户进程:Init进程(概述) Zygote进程以及其初始化 Zygote 启动应用程序 Android SystemServer 进程 关于 PackageManagerSer ...

  8. 对zygote的理解

    一. zygote的作用 启动SystemServer SystemServer需要用于zygote准备好的一些系统资源,比如常用类.注册的JNI函数.主题资源.共享库等等,直接从zygote那继承过 ...

  9. 专题总纲目录 Android Framework 总纲

    专题总纲说明: 本系列文章虽说是 Android 的知识体系专题,同时也是学习Android Framework 系统的一个思路,尤其是当我们对Android 框架层 一点都不了解的时候,但前提是要有 ...

最新文章

  1. Zookeeper 安装和配置
  2. 调整linux的时钟
  3. 阿里巴巴分布式服务框架 Dubbo 团队成员梁飞专访
  4. rules不显示 vue_使用stylelint规范vue项目
  5. SAP用户增强总结-采购订单建立增加客户数据增强示例
  6. opengl加载显示3D模型UC类型文件
  7. Redis的主从搭建
  8. Oracle基于布尔的盲注总结
  9. PPTV Docker集群的网络方案选型
  10. iOS WKWebView和JS交互的两种方式
  11. 无线网络技术学习总结
  12. vue项目中引入字体图标库(傻瓜式教程,详解)
  13. 脚本自动化互相阅读文章教程
  14. vbscript mysql_vbscript 数据库操作
  15. vue+element项目,升级element后带tabs模块的页面。导致页面崩溃白屏问题?
  16. linux 源码 调试,Linux基础-源代码编译和调试.ppt
  17. 关于香港高防IP需要关注的几个问题
  18. GM300写频软件的使用
  19. 《极光征文》颁奖 | 恭喜你完成 2019 第一个小目标
  20. 《炒股的智慧》第5节文摘

热门文章

  1. MySQL数据库笔记小结一
  2. 生成器、迭代器、可迭代对象
  3. 单片机中0x00和0x01有什么区别
  4. 第三方设置cookie提示Mark cross-site cookies as Secure to allow setting them in cross-site contex
  5. blastFoam水下爆炸数值仿真计算
  6. (1)goland下载安装+示例代码运行
  7. 7道腾讯算法编程真题,你能做对几道?包含一道趣味题
  8. 卫星定位基础理论之GPS信号及其导航电文
  9. 独立开发变现周刊(第65期): 个人爱好发展成一项36万美元/年的NFTs业务
  10. elementUI 表格多选框this.$refs.xxx.toggleRowSelection无效