android jni fork()子进程不运行_Android高级面试谈谈Zygote的理解

Zygoto的作用

Zygoto的作用有两个:

  • 1. 启动SystemServer

  • 2. 孵化应用进程

SystemServer也是通过Zygoto来启动的,因为SystemServer需要Zygoto初始化好的一些系统资源,包括常用的类、JNI函数、共享库等等,这些资源直接从Zygoto继承过来对启动SystemServer是一件性能提升的事情。

Android中进程启动的通用流程 - 启动三段式

  • 进程启动 -> 准备工作 -> Loop循环

Loop循环的作用是为了接收消息并处理消息。在Android中,所有的独立进程的启动都是符合这个启动流程的。

Zygoto的启动流程

Linux启动之后,用户空间的第一个进程是Init进程,Init进程在启动之后会去读取init.rc的启动配置文件,其中定义了需要启动的系统进程(其中包含Zygoto进程)。Init进程启动Zygoto的方式是fork + execve的方式。

进程启动通常有两种方式:

  • 1. fork + handle

  • 2. fork + execve

516bb67733a00a09b0873edab9b27641.png

01afda5b2d11235fbcd88a53a856b0a8.png

【说明】

1. fork函数在创建进程的时候,会返回两次,返回两个pid,当pid = 0的时候,说明当前处于子进程,当pid不为0表示当前处于父进程中,而此时的pid为子进程的pid;

2.fork函数创建的进程继承了父进程所有的系统资源,我们在fork出的子进程中调用execve方法加载二进制文件可以重置继承自父进程的系统资源。

信号处理 - SIGCHLD

父进程通过fork创建的子进程,当子进程挂了之后,父进程会收到一个SIGCHLD的信号,此时我们就可以在父进程中重启子进程。

2e0c0af74d5e0f9d853a790d71aa61be.png

Zygoto在创建之后做了些什么

  • 1. Zygoto在native世界

  • 2. Zygoto在Java世界

Zygoto是C++编写的,通过main函数入口运行,Zygoto在native做了3件事情,这3件事情都是为了进入Java世界作准备:

57474bca9f6f56a3b1bd5675a11f1ab7.png

从上图可以看到,Zygoto启动之后,首先启动Android的虚拟机,然后注册一些Android的关键的JNI函数,最后通过调用JNI函数进入Java世界。

966913a266d5c0c626e8cf3c854cdf59.png

上面的代码就是Zygoto启动之后做的事情,从上面的代码可以看到,Zygoto首先通过JNI_CreateJavaVM创建虚拟机,在找到ZygotoInit的Java类文件,并获取到该Java类的Main静态函数,最后通过CallStaticVoidMethod方法调用Java类ZygotoInit的Main静态方法。

我们在应用进程中调用JNI的时候,是不需要创建虚拟机的,即不需要调用JNI_CreateJavaVM方法,这是因为虚拟机已经在Zygoto中创建完毕,且应用进程是有Zygoto孵化的,应用进程继承了Zygoto所有的系统资源,同样包含虚拟机,所以在应用进程中调用JNI函数前,无需再次调用JNI_CreateJavaVM来创建虚拟机。

Zygoto在Java世界中要做的事情有3件:

  • 1. 加载资源,这是为了在后续孵化子进程的时候,可以将加载的系统资源继承给子进程;

  • 2. 通过fork函数孵化SystemServer进程

  • 3. 启动Loop循环,接收并处理Socket消息

Zygoto启动Loop循环之后,会接收Socket消息,每次接收到Socket消息之后,就会调用runOnce方法处理消息:

b87afbe90aed49f4d2756da83d0bde2e.png

上面的代码是Loop中一次消息处理的过程,首先会通过readArgumentList方法读取本次通过Socket传递过来的参数,然后fork启动一个子进程,再在子进程中处理参数。

子进程是通过handleChildProc方法来处理参数,handleChildProc本质上就是调用某个Java类的main函数,执行的是哪个Java类呢,执行的Java类的名称是通过AMS(Activity Manager Server)借助Socket发过来的,此处通过readArgumentList读取到的。

注意的细节:

  • 1. Zygoto fork需要单进程

    Zygoto通过fork创建的子进程中只包含一个线程,而Zygoto中包含多个线程(e.g. 守护线程等等),这些多余的线程在创建完成的子线程中是不存在的,就会造成子进程中状态的错误,所以在Zygoto fork新的子进程的时候,会将所有主线程以外的子线程全部暂停,fork完毕之后,再启动所有的子线程。

  • 2. Zygoto的IPC(跨进程通宵)没有采用Binder机制,而是使用本地的Socket服务。Zygoto进程并没有Binder机制,所以Zygoto创建的应用进程中也没有继承到Binder,应用进程的Binder是应用进程启动之后自己创建启动的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558122.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

送给女朋友的情话

风拂鹊桥霓裳起 与卿漫话风雨里 初识 那一年端午 带着无比喜悦与期待 搭上去福州的火车 那一年端午 从福州到泉州 再到柴塔 连地名都好有神秘的感觉 迷糊的眼镜和疲倦的神情,刚好匹配得上 从此有了我们的传说 到了2022的七月七,还是一如既往 小特效 图…

lazada发货_Lazada发货用什么物流?费用要多少?

有买家到Lazada店铺下单之后,卖家就要安排订单发货了。Lazada发货的管控也是比较严格的,各位卖家要及时发货。小编也遇到不少新手卖家的咨询,问Lazada发货方式有哪些?以及发货流程是怎样的?下面针对这些问题&#xff0…

导入表格只有一行 帆软_万万没想到!把x个表格合合合合成一份,10分钟就搞定...

正值年中,老板交代把上半年各个地区提交的数据表格做个汇总。怎么办?一个地区一张表打开华南区的表,复制】-打开汇总表-【粘贴】再打开华北区的表【复制】-打开汇总表-【粘贴】……类似的工作任务还真不少各个单位上交的报名表各部门的生产计…

vim插件自动补齐_给VIM添加REPL

REPL: 读取-求值-输出”循环(英语:Read-Eval-Print Loop,简称REPL)是一个简单的,交互式的编程环境。python作为一个动态语言,REPL在开发过程中起到了很大的作用。可是一直以来用vim写python没有一个很好的&…

Linux ping 详细介绍(win也适用)

多数情况下,能否访问某台电脑或服务器,很自然的使用ping xxx.xxx.xxx.xxx,这是最简单的ping形式,同时看到ping几个包之后就停止(windows)了,linux 会一直ping下去,直到按ctrlc或其他组合键。在windows平台或linux平台&…

巨一自动化工业机器人_工业机器人和自动化设备连接器

来源:大比特商务网 作者:Ann Thryft随着工业物联网(IIOT)不断扩大,给工厂带来了更多电子设备。 这些设备往往暴露在恶劣环境中,包括灰尘、油、液体和极端温度等。 同时,特别是随着协作机器人装配在工厂生产线上&#x…

pvrect r语言 聚类_R语言常用统计方法包+机器学习包(名称、简介)

上期帮大家盘点了一下R中常用的可视化包,这期将简要盘点一下关于统计分析与机器学习的R包,并通过简要介绍包的特点来帮助读者深入理解可视化包。本文作者为“食物链顶端”学习群中的小伙伴,感谢他们的分享。话不多说我们一起来看看吧&#xf…

rap2检测哪些接口在使用_Apifox for Mac(接口调试管理工具)

Apifox 是一款用于接口文档定义、Mock 数据、接口自动化测试等等方面的工具,它的功能高效好用,接口云端同步,实时更新。成熟的团队/项目权限管理,满足各类企业的需求。有需要的朋友赶快来使用吧!Apifox 软件介绍软件开…

layui根据name获取对象_layui表格行合并;解决侧边固定栏合并

实现效果图:适配分页&#xff1b;全选&#xff1b;后台嵌套数据&#xff1a;获取数据后&#xff1b;渲染前操作&#xff1a;,done:function(res){if(res.data){for(var i 0;i<res.data.length;i){var trObj $([lay-id"table"] .layui-table-box).find([data-ind…

abap al设置单元格可编辑 oo_利用WPS做业务系统的超级编辑器

业务系统中的数据很笼统的分可以分为两大类&#xff0c;一个是结构化的&#xff0c;通常用关系型数据库来存储管理&#xff1b;一个是非结构化的&#xff0c;在这类数据中&#xff0c;可能最多、价值密度最大的就是文档。如何更便捷高效的生成或分析文档&#xff0c;就是业务系…

pyecharts怎么绘制散点图_pyecharts可视化和wx的结合

前言最近在研究 pyecharts 的用法&#xff0c;它是 python 的一个可视化工具&#xff0c;然后就想着结合微信来一起玩不多说&#xff0c;直接看效果&#xff1a;条形图.gif环境配置pip install pyechartspip install snapshot_seleniumpip install echarts-countries-pypkgpip …

jekenis父子结构项目打包_全栈之DevOps系列 - 发布 Python 项目 开源/私有 包

DevOps目前并没有权威的定义&#xff0c;普遍认为&#xff0c;DevOps 强调的是高效组织团队之间如何通过自动化的工具协作和沟通来完成软件的生命周期管理&#xff0c;从而更快、更频繁地交付更稳定的软件。作者以 dukepy 系列项目中 dkimageapp 子项目&#xff08;关于图像处理…

如何计算_振动筛处理能力如何计算呢

振动筛在生活中的应用可谓设计到方方面面&#xff0c;大到煤炭开采筛分。小到果汁饮料&#xff0c;这些都离不开振动筛或者震动筛的身影。下面和道联合机械讲解一下如何计算振动筛的处理量&#xff0c;从而选购好的振动筛。振动筛的处理能力计算公式主要如下&#xff1a;1、处理…

springsession分布式登录被覆盖_拉勾 分布式 学习小结

分布式和集群分布式一定是集群&#xff0c;但是集群不一定是分布式&#xff08;可能是复制的&#xff09;集群是多个实例一起工作&#xff0c;分布式将一个系统拆分之后那就是多个实例分布式应用结构&#xff1a;Hash算法适用于在加密&#xff0c;数据存储和查找方面有hash表&a…

c++ 舞伴配对问题_R绘图:配对样本差异表达作图ggpubr

R绘图往期回顾&#xff1a;R绘图&#xff1a;唱一半的歌&#xff0c;画一半的图 gghalvesR绘图&#xff1a;gggibbous&#xff0c;基于ggplot2的Moon chartsR绘图&#xff1a;ggeconodist&#xff0c;基于ggplot2的另类箱图R语言学习系列之“多变的热图”蚂蚁金服在线可视化引擎…

输入引脚时钟约束_最强干货分享 | 时钟树例外(exclude pin、stop pin、non_stop pin、float pin)...

《最强干货分享时钟树例外(exclude pin、stop pin、non_stop pin、float pin)》研究生毕业之前曾发过这篇推文&#xff0c;现在在原来的基础上进行了修正&#xff0c;又添加了一些内容&#xff0c;几乎是压箱底的&#xff0c;现在拿出来分享一下&#xff0c;如果觉得好的话麻烦…

mac mysql not found_mac下mysql提示command not found解决

原标题&#xff1a;mac下mysql提示command not found解决问题描述输入mysql -u root -p会出现&#xff1a;zsh: command not found: mysql的提示&#xff0c;此时需要配置环境变量。解决方法一1 .打开终端,输入&#xff1a; cd ~2.输入&#xff1a;sudo vim .bash_profile回车执…

mysql数据库删除列数据_MySQL数据库-数据表、以及列的增删改查

1、创建一个表CREATE(创建)TABLE(表)ENGINE(引擎)ENGINEINNODB(引擎)还有很多类引擎&#xff0c;这里只是简单的提一下INNODB引擎&#xff0c;INNODB引擎支持事务(回滚)&#xff0c;也就是一个事务执行时如果没有完成数据可以回滚CHARSET(字符编码)CREATE TABLE(创建表)--创建表…

mysql 分区 性能更差_用案例分析MySQL 5.7分区表性能下降的根本原因

前言&#xff1a;希望通过本文&#xff0c;使MySQL5.7.18的使用者知晓分区表使用中存在的陷阱&#xff0c;避免在该版本上继续踩坑。同时通过对源码的分享&#xff0c;升级MySQL5.7.18时分区表性能下降的根本原因&#xff0c;向MySQL源码爱好者展示分区表实现中锁的运用。问题描…

java 数组 截取_Java成长孵化园---认识java(day09)

1、APIApplication Programming Interface应用编程接口一切可以调用的东西&#xff0c;都是API2、基础APIObject、String、StringBuilder/StringBuffer、正则表达式、基本类型的包装类、BigDecimal/BigInteger、Date、SimpleDateFormat3、java.lang.Objectlang包&#xff1a;la…