Zygote进程通信为什么用Socket而不是Binder?

Zygote进程是Android系统中的一个特殊进程,它在系统启动时被创建,并负责孵化其他应用进程。它的主要作用是预加载和共享应用进程的资源,以提高应用启动的速度。

在Android系统中,常用的进程通信方式有以下几种:

  1. Intents:Intents是Android系统中用于在不同组件之间传递消息的一种机制。通过发送和接收Intents,不同进程之间可以进行简单的通信。

  2. Binder:Binder是Android系统中的一种进程间通信(IPC)机制,它基于C/S(Client/Server)模型。Binder提供了一种高效的跨进程通信方式,可以在不同进程之间传递复杂的数据结构。

  3. ContentProvider:ContentProvider是Android系统中用于实现进程间数据共享的一种机制。通过ContentProvider,一个进程可以将自己的数据暴露给其他进程,其他进程可以通过ContentResolver来访问这些数据。

  4. Socket:Socket是一种基于网络的进程间通信方式,它可以在不同设备之间进行通信。通过Socket,不同进程可以通过网络传输数据。

Zygote进程介绍

Zygote进程是Android系统中的一个特殊进程,它在系统启动时被创建,并负责孵化其他应用进程。它的主要作用是预加载常用的系统类和资源,以提高应用启动的速度。

在Android系统中,每个应用都运行在独立的进程中,这样可以保证应用之间的隔离性。然而,创建新进程需要消耗一定的时间和资源。为了减少应用启动的时间,Android引入了Zygote进程。

Zygote进程在系统启动时会先加载一些常用的系统类和资源,然后通过fork()系统调用创建新的应用进程。新的应用进程会继承Zygote进程的内存空间,从而避免了重新加载系统类和资源的开销。这样,应用进程的启动速度就会大大提高。

Zygote的创建和启动过程:

  1. 系统启动时,Linux内核会加载init进程,init进程是Android系统的第一个用户空间进程。
  2. init进程会读取init.rc文件,该文件定义了系统启动时需要执行的一系列操作。
  3. 在init.rc文件中,会有一条类似于"service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server"的命令。
  4. 这条命令会启动一个名为zygote的进程,该进程的可执行文件是app_process,位于/system/bin目录下。同时,命令中的参数"-Xzygote"表示以zygote作为进程名,“–zygote"表示以zygote的方式启动进程,”–start-system-server"表示启动系统服务。
  5. Zygote进程启动后,会先执行一些初始化操作,然后进入主循环等待创建其他应用进程的请求。
  6. 当有应用进程需要创建时,Zygote会fork出一个子进程,并通过socket与子进程进行通信。
  7. 子进程会继承Zygote进程的资源,包括虚拟机、类加载器等,从而加快应用进程的启动速度。
  8. 子进程会加载应用的主类,并调用其main方法,从而启动应用。

Socket通信介绍

Socket通信是一种常见的进程间通信方式,它基于网络套接字(Socket)来实现进程之间的数据传输。Socket通信可以在同一台计算机上的不同进程之间进行通信,也可以在不同计算机上的进程之间进行通信。

在Socket通信中,一个进程可以充当服务器(Server),另一个进程可以充当客户端(Client)。服务器进程通过创建一个Socket,并绑定到一个特定的网络地址和端口上,等待客户端的连接请求。客户端进程通过创建一个Socket,并指定服务器的地址和端口,向服务器发起连接请求。

一旦建立了连接,服务器和客户端之间就可以通过Socket进行数据的发送和接收。服务器可以同时处理多个客户端的请求,每个客户端都会被分配一个独立的Socket连接。

Socket通信可以使用不同的协议,如TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)。TCP是一种可靠的、面向连接的协议,它提供了数据的可靠传输和流式传输。UDP是一种无连接的协议,它提供了数据的不可靠传输和数据报传输。

Binder机制介绍

Binder是Android操作系统中的一种进程间通信(IPC)机制。它是一种高效的、基于消息传递的IPC机制,用于在Android系统中不同进程之间进行通信。

Binder的核心是一个驱动程序,它负责在不同进程之间传递消息。在Android系统中,每个应用程序运行在独立的进程中,而Binder机制允许这些进程之间进行通信,以实现数据共享和功能调用。

Binder机制的基本原理是通过Binder驱动程序提供的接口,将消息从一个进程发送到另一个进程。每个进程都有一个Binder对象,用于接收和处理来自其他进程的消息。当一个进程想要与另一个进程通信时,它可以通过Binder对象发送消息,并等待接收方的响应。

在Android系统中,Binder机制被广泛应用于各种场景,例如Activity与Service之间的通信、进程间共享数据等。它提供了一种安全可靠的IPC机制,能够有效地解决进程间通信的问题。

Socket与Binder对比

Socket和Binder是Android系统中常用的通信机制,它们在实现方式和使用场景上有一些区别。

  1. 实现方式:

    • Socket是一种基于网络协议的通信机制,通过网络套接字实现进程间通信。它使用TCP或UDP协议进行数据传输,可以在不同设备或同一设备的不同进程之间进行通信。
    • Binder是一种基于内核驱动的进程间通信机制,它通过驱动程序实现进程间的数据传输。Binder使用C/S架构,包括服务端和客户端,通过Binder驱动在内核空间中进行通信。
  2. 使用场景:

    • Socket适用于网络通信场景,可以在不同设备或同一设备的不同进程之间进行通信。常见的应用包括网络传输、远程过程调用(RPC)等。
    • Binder适用于Android系统内部的进程间通信场景,主要用于应用程序组件之间的通信,如Activity与Service之间的通信、跨进程的数据共享等。
  3. 性能和安全性:

    • Socket通信的性能相对较高,但在跨设备通信时需要考虑网络延迟和带宽等因素。同时,Socket通信需要进行网络权限的申请和管理,可能存在一定的安全风险。
    • Binder通信的性能相对较低,但在同一设备内部的进程间通信时具有较高的效率。同时,Binder通信在Android系统中有较好的安全性,可以通过权限控制和进程隔离来保护系统的安全性。

综上所述,Socket适用于网络通信场景,而Binder适用于Android系统内部的进程间通信场景。在选择通信机制时,需要根据具体的应用场景和需求进行选择。

Zygote进程为什么用Socket而不是Binder?

  1. 先后时序问题: Binder驱动是早于init进程加载的。而init进程是安卓系统启动的第一个进程。安卓中一般使用的Binder引用,都是保存在ServiceManager进程中的,而如果想从ServiceManager中获取到对应的Binder引用,前提是需要注册。init进程是先创建ServiceManager,后创建Zygote进程的。虽然Zygote更晚创建,但是也不能保证Zygote进程去注册binder的时候,ServiceManager已经初始化好了。注册时间点无法保证,AMS无法获取到Zygote的binder引用。

  2. 多线程问题: Linux中fork进程是不推荐fork一个多线程的进程的,因为如果存在锁的情况下,会导致锁异常。而如果自身作为Binder机制的接收者,就会创建一个额外的线程来进行处理(发送者进程是无影响的)。所以,如果使用Binder机制,就会导致去fork一个多线程的进程。

  3. 效率问题: AMS和Zygote之间使用的LocalSocket,相对于网络Socket,减少了数据验证等环节,所以其实效率相对于正常的网络Socket会大幅的提升。虽然还是要经过两次拷贝,但是由于数据量并不大,所以其实影响并不明显。

  4. Binder拷贝问题: 如果使用Binder机制的话,从Zygote中fork出子进程会拷贝Zygote中Binder对象。从而多占用了一块无用的内存区域。而Binder对象不能释放。Binder的特殊性在于其是成对存在的,其分为Client端对象和Server端对象。假设我们使用Binder,如果要释放掉Server端Binder引用对象,就必须释放掉AMS中的Client端Binder对象,那这样就会导致AMS失去Binder从而无法正常向Zygote发送消息。而使用Socket通讯的话,fork出APP进程之后,APP进程会去主动的关闭掉这个Socket,从而释放这块区域。使用Binder会造成额外的内存占用。

Zygote处理Socket消息

当一个应用程序需要创建一个新的进程时,它会通过Socket与Zygote进程进行通信。具体来说,应用程序会向Zygote进程发送一个包含应用程序的包名、进程名和其他参数的消息。Zygote进程接收到这个消息后,会根据这些参数创建一个新的进程,并执行应用程序的入口函数。

Zygote进程处理socket消息的过程可以简单描述如下:

  1. Zygote进程创建一个Socket,并绑定到一个特定的端口上,等待应用程序的连接请求。
  2. 当一个应用程序需要创建新进程时,它会通过Socket连接到Zygote进程,并发送一个包含应用程序参数的消息。
  3. Zygote进程接收到消息后,解析参数,并根据参数创建一个新的进程。
  4. Zygote进程将新进程的PID返回给应用程序,以便应用程序可以与新进程进行通信。

需要注意的是,Zygote进程并不直接处理Socket消息的具体内容,而是将消息传递给相应的处理函数来完成进程创建的工作。这些处理函数会根据消息中的参数来执行相应的操作,例如加载应用程序的代码、创建进程的环境等。

Zygote进程通过Socket与应用程序进行通信,接收应用程序的参数,并根据这些参数创建新的进程。这种机制使得Android系统能够高效地创建和管理大量的应用程序进程。

如果你还没有掌握Zygote,现在想要在最短的时间里吃透它,可以参考一下《Android Framework核心知识点》,里面内容包含了:Init、Zygote、SystemServer、Binder、Handler、AMS、PMS、Launcher……等知识点记录。

《Framework 核心知识点汇总手册》:https://qr18.cn/AQpN4J

Handler 机制实现原理部分:
1.宏观理论分析与Message源码分析
2.MessageQueue的源码分析
3.Looper的源码分析
4.handler的源码分析
5.总结

Binder 原理:
1.学习Binder前必须要了解的知识点
2.ServiceManager中的Binder机制
3.系统服务的注册过程
4.ServiceManager的启动过程
5.系统服务的获取过程
6.Java Binder的初始化
7.Java Binder中系统服务的注册过程

Zygote :

  1. Android系统的启动过程及Zygote的启动过程
  2. 应用进程的启动过程

AMS源码分析 :

  1. Activity生命周期管理
  2. onActivityResult执行过程
  3. AMS中Activity栈管理详解

深入PMS源码:

1.PMS的启动过程和执行流程
2.APK的安装和卸载源码分析
3.PMS中intent-filter的匹配架构

WMS:
1.WMS的诞生
2.WMS的重要成员和Window的添加过程
3.Window的删除过程

《Android Framework学习手册》:https://qr18.cn/AQpN4J

  1. 开机Init 进程
  2. 开机启动 Zygote 进程
  3. 开机启动 SystemServer 进程
  4. Binder 驱动
  5. AMS 的启动过程
  6. PMS 的启动过程
  7. Launcher 的启动过程
  8. Android 四大组件
  9. Android 系统服务 - Input 事件的分发过程
  10. Android 底层渲染 - 屏幕刷新机制源码分析
  11. Android 源码分析实战

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

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

相关文章

支付宝AI布局: 新产品助力小程序智能化,未来持续投入加速创新

支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA收款等生活服务应用。 支付宝不仅是一个支付工具,也是一个数字生活平台,通过…

pycharm更改远程服务器地址

一、问题描述 在运行一些项目时,我们常需要在pycharm中连接远程服务器,但万一远程服务器的ip发生了变化,该如何修改呢?我们在file-settings-python interpreter中找到远程服务器,但是发现ip是灰色的,没有办…

JVM 分代垃圾回收过程

堆空间划分了代: 年轻代(Young Generation)分为 eden 和 Survivor 两个区,Survivor 又分为2个均等的区,S0 和 S1。 首先,新对象都分配到年轻代的 eden 空间,Survivor 刚开始是空的。 当 eden …

AIGC | 如何用“Flow”,轻松解决复杂业务问题

随着LLM(大语言模型)的爆火,不少企业都在寻找通过LLM解决企业业务问题的方法,以达到降本增效的效果。但是,当面对较为复杂的业务问题(如:背景资料多、问题分类多、条件判断复杂、涉及模块多等&a…

儿童玩具跨境电商/TEMU平台要求北美CPC认证欧洲CE认证

儿童玩具跨境电商/TEMU平台要求北美CPC认证欧洲CE认证 最近Temu严格抽查一份关于儿童用品合规的通知。通知指出,为了保障Temu平台消费者的合法权益,以及保障儿童类商品在目的国的正常销售及合规要求,对于以12岁及以下儿童为主要使用对象的产…

《Webpack 5 基础配置》- 禁止在出现编译错误或警告时,覆盖浏览器全屏显示

Webpack5 overlay 配置地址默认编译错误或警告为 true,即浏览器全屏显示;overlay 属性可以是 boolean 型,也可是 object 类型;还有其它设置说明,详见上述官网地址; module.exports {devServer: {client: {…

【CesiumJS】(1)Hello world

介绍 Cesium 起源于2011年,初衷是航空软件公司(Analytical Graphics, Inc.)的一个团队要制作世界上最准确、性能最高且具有时间动态性的虚拟地球。取名"Cesium"是因为元素铯Cesium让原子钟非常准确(1967年,人们依据铯原子的振动而对…

【TypeScript】认识TypeScript

❤️ Author: 老九 ☕️ 个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏: 文章目录 TypeScriptJavascript的缺点使用TypeScript重构TypeScript的编译环境全局安装TS编译环境TS编译简…

Websocket传输协议是什么

WebSocket 是一种网络通信协议,属于 HTML5 规范的一部分。它提供了在单个长期连接上进行全双工通信的能力,使得数据可以从客户端发送到服务器,也可以从服务器发送到客户端,这与传统的 HTTP 请求和响应模型不同。 WebSocket 协议定…

设数据为01101001,试采用4个校验位求其偶校验方式的海明码。

遇到一个题目,但是教材书上写的比较迷糊,看不懂,后来在网上搜了一下方法,发现还是比较简单的,现在分享一下我的解法 首先,套用公式:2k - 1 > n k 因为求得数字是8位数,n8&#x…

微信小程序导入js使用时候报错

我是引入weapp库时候,导入js会报错。 需要在小程序开发工具里面配置 就可以了。

Python中的sys模块详解

1. 简介 sys模块是Python标准库中的一个内置模块,提供了与Python解释器和运行环境相关的功能。它包含了一些与系统操作和交互相关的函数和变量,可以用于获取命令行参数、控制程序的执行、管理模块和包、处理异常等。 2. 常用函数和变量 2.1 命令行参数…

ubuntu安装python以及conda

切换国内镜像源 备份下 sudo cp /etc/apt/sources.list /etc/apt/sources_init.list 更换源 sudo vi /etc/apt/sources.list 开头加 deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ trusty-sec…

【Linux】Linux项目部署及更改访问端口号和jdk、tomcat、MySQL环境搭建的配置安装

目录 一、作用 二、配置 1、上传安装包 2、jdk 2.1、解压对应安装包 2.2、环境变量搭建 3、tomcat 3.1、解压对应安装包 3.2、启动 3.3、设置防火墙 3.4、设置开发端口 4、MySQL 三、后端部署 四、Linux部署项目 1、单体项目 五、修改端口访问 1、进入目录 2…

Annotorious入门教程:图片注释工具

本文简介 最近有工友问我前端怎么给图片做标注。使用 Fabric.js 或者 Konva.js 等库确实可以实现,但我又好奇有没有专门做图片标注的工具呢? 在网上搜了一下发现 Annotorious 可以实现这个功能。Annotorious 提供了图片注释和标注功能,而且…

数字化时代,数据仓库是什么?有什么用?

在激烈的市场竞争和全新的数字经济共同作用下,数字化转型成为了大多数企业的共识,也是获取数字经济的最佳方式。在整个数据价值生产链路中,数据仓库的主要作用就是中心化分发,将原始数据与数据价值挖掘活动隔离。 所有的原始数据…

图像二值化阈值调整——cv2.threshold方法

二值化阈值调整:调整是指在进行图像二值化处理时,调整阈值的过程。阈值决定了将图像中的像素分为黑色和白色的界限,大于阈值的像素被设置为白色,小于等于阈值的像素被设置为黑色。 首先画出灰度直方图:横坐标是灰度值…

React中的状态管理

目录 前言 1. React中的状态管理 1.1 本地状态管理 1.2 全局状态管理 Redux React Context 2. React状态管理的优势 总结 前言 当谈到前端开发中的状态管理时,React是一个备受推崇的选择。React的状态管理机制被广泛应用于构建大型、复杂的应用程序&#xf…

【漏洞复现】74cms任意文件读取

漏洞描述 74CMS 是一款国内用的比较多招聘网站管理系统(Job Board CMS),专注于招聘和人力资源领域的网站建设,存在任意文件读取漏洞 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律&#xff0c…

面向网络安全-Python语言

目录 1、变量 2、字符串 3、列表 4、字典 5、网络 6、条件选择语句 7、异常处理 1、变量 变量是指储存在某个内存地址上的数据 主要有:整型数、实数、布尔值、字符串、列表、元组、字典 这些数据在声明后,解释器就会自动确定每个变量的类型&…