Android 进程间通信(IPC机制)精炼详解

news2025/7/31 13:53:54

今天主要对 Android 中的跨进程通信进行总结下,先梳理下里面的涉及的一些概念

进程与线程

  • 进程: 系统中正在运行的一个应用程序,某个程序一旦运行就是一个进程,是资源分配的最小单位;
  • 线程: 程序执行的最小单位,包含在进程中,一个进程可以包含多个线程。

Android 应用中的多进程

(1)dalivk虚拟机

Android 系统的底层任务管理以及驱动都是基于 Linux 系统;一个 Android 系统其实就是一个 Linux 系统,通过 adb shell 进入连接的手机,就可以看到 Linux 系统的文件系统

像在运行一个 Java 程序,我们知道 Linux 系统会启动一个Java虚拟机来运行该 Java 程序,而 Android 系统是一个特殊的 Linux 系统,当启动一个 APP,系统会为该 APP 分配一个 Linux 进程,而该进程中就会有一个 dalivk 虚拟机(又称为 DVM )实例来运行该 APP,所以 dalivk 虚拟机就是用来运行 APP 程序

不同的APP运行在不同的进程中,对应着不同的dalivk虚拟机,就对应着不同的地址空间。反过来在一个应用内,如果新开一个进程,那么由于系统在新开进程的时候会分配独立的dalivk虚拟机,那么对于该APP内的不同进程的实例是互相独立,互不影响。

综上:

  • 1)每个进程有独立的dalivk虚拟机,对应着单独的内存空间;
  • 2)一个应用可以有多个进程,就有多个dalivk虚拟机,对应多个内存空间;
  • 3)一个进程可以被多个应用访问,多个应用可以共享该进程

(2)Linux 系统组成

在 Linux 系统中,虚拟内存空间(我理解的就是运行软件程序的空间,是对物理空间的映射)只有 4G最高的 1GB(对应虚拟地址0xC0000000到0xFFFFFFFF)被成为内核空间,而较低的 3GB(对应虚拟地址0x00000000到0xBFFFFFFF)被成为用户空间。内核空间是Linux内核运行空间,用户空间是应用程序的运行空间。如图所示:

image

  • 内核空间:可以访问受保护的内存空间,有访问底层硬件设备的所有权限;
  • 用户空间:上层应用程序和Native层的运行空间,用户空间没法直接访
  • 内核空间,需要系统调用才可以访问内核空间。

不同进程之间,用户空间是不共享,但是内核空间是可以共享。

(3)定义多进程

默认情况下,启动一个APP,仅仅启动了一个进程,该进程名为包名,那如何定义多进程呢? Android 提供了一种方式,就是在 AndroidManifest 文件中可以通过 “android:process” 来指定进程:

  • 1)不指定 process: 默认的进程,进程名为包名;
  • 2)指定 process,但以":"开头: 该进程为当前APP的私有进程,不允许其他APP访问
  • 3)指定process,但以小写字母开头的字符串: 该进程为全局进程 ,其他应用可设置相同的shareUID来共享该进程

(4)为什么要引入多进程?

为什么一个 Android 应用要引入多进程?多进程有哪些应用场景呢?

通常在下面两种情况下需要引入多进程:

  • 由于 Android 系统会限制每个应用的最大内存,所以如果一个应用需要更多可用的内存时,就需要引入多进程,让某些模块运行在另外的进程中,获取更多的内存;
  • 由于不同的应用运行在不同的进程中,但是如果两个不同的应用之间需要进行数据通信

(5)跨进程通信

既然在 Android 中引入了多进程,而对于进程的用户空间不共享,那么多进程之间怎么通信呢?

这种多进程通信又称为IPC(Inter Process Communication)

对于IPC,并不是Android系统特有的,在Linux系统中就存在的跨进程通信,在Linux系统中常见的IPC方式有:

  • 1)管道Pipe: 在内存中创建一个共享文件,利用共享文件传递信息。该共享文件并不是文件系统,只存在于内存中;只能在一个方向上流动
  • 2)信号Signal: 异步通信。信号在用户空间和内核空间之间交互,内核可利用信号来通知用户空间的进程发生哪些系统事件。不适用于信号交换,适用于过程中断控制;
  • 3)信号量Semaphore: 控制多个进程对共享资源的访问。主要是进程间以及同一进程不同线程之间的同步手段;
  • 4)消息队列 Message Queue: 存放在内存中并由消息对了标识符标识,允许一个或多个进程对它进行读写消息。信息会复制两次,不适用于频繁或信息量大的通信
  • 5)共享内存Shared Memory: 直接读写内核的一块内存空间。不需要进行数据拷贝
  • 6)套接字Socket: 不同机器之间进程间通信。

而在 Android 中,场景的 IPC 方式有:

  • 1)Bundle: 实现了Parcelable接口,常用于Activity、Service、BroadcastReceive之间的通信
  • 2)文件共享: 常用于无并发,交换实时性不高的数据
  • 3)Messenger: 低并发的一对多即时通信。串行的方式处理Client发来的消息,只能传输数据,不能方法调用(RPC)
  • 4)ContentProvider: 存储和获取数据,不同程序之间共享数据。一对多的数据共享
  • 5)AIDL
  • 6)Socket: 网络数据交换

除去 Socket,其他的都是基于 Binder 机制实现的

(6)多进程带来的问题

在进程结构中也提到了用户空间是不共享的,并且每个进程都是对应单独系统堆栈区、静态区等,那么多进程也引入了一些问题:

  • 每个进程都是保持自己单独的静态成员变量和单例;
  • 每个进程都是单独的进程锁;
  • SharedPreferences可靠性下降,不支持并发写;
  • 对于单个APP的多进程,就会创建多个Application,每个进程都会拥有己的Application对象。

题外话: 最后的这个信息让我想起之前看 web 开发相关的一些信息:Tomcat 也是运行在 Linux 系统中,在部署 web 应用的时候,可以把一个 web 应用部署到多个 Tomcat 服务器上,那么每个 Tomcat 服务器都会给该 web 应用分配一个 ServletContext

这篇文章,其实不难;主要是将 Android 中的跨进程通信以及开发当中经常用到的一些知识点,总结了一下

想要往向更深入学习难免需要寻找很多的学习资料辅助,我在这里推荐网上整合的一套 《 Android 跨进程通信学习手册》;有需要的小伙伴:可在评论区下方留言,或者 私信发送 “IPC进阶” 即可 直达领取;鉴于出自大佬之手,可以帮助到大家,能够少走些弯路

手册包含如下技术点:

  • Android IPC学习
  • bionic学习
  • framework层c++篇
  • framework层Java篇
  • IPC binder 相关结构体
  • IPC binder的三大接口
  • IPC binder跨进程通信补充
  • IPC binder框架
  • IPC binder驱动
  • IPC binder总结
  • IPC binder总结
  • jni学习
  • linux学习
  • misc
  • 跨进程通信IPC之AID

文档内容展示如下:

IPC 跨进程 之 Framework 层 C++ 篇

  • ServiceManager 的启动
  • ServiceManager 的核心服务
  • ServiceManager 的获得
  • 注册服务
  • 获得服务

Binder 之 Framework 层 Java 篇

  • startReg()函数
  • register_android_os_Binder()函数
  • getIServiceManager()方法
  • addService()方法详解
  • ServiceManager.getService()方法

IPC 之 Binder 的补充

  • Binder 中的线程池
  • Binder 的权限
  • Binder 的死亡通知机制

IPC 之 Binder 总结

  • Android 为什么选用 Binder 作为最重要的 IPC 机制
  • Binder 中相关的类简述
  • Binder 机制概述
  • Binder 通信概述
  • Binder 协议
  • Binder 架构

篇幅原因,就不在这里为大家赘述了,有需要的小伙伴:可在评论区下方留言,或者 私信发送 “IPC进阶” 即可 直达领取这份 《Android 跨进程通信学习手册》

最后大家如果觉得手册内容有用的话,可以点赞分享一下哦~

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

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

相关文章

曙光云使用说明

平台链接 https://ac.sugon.com/ac/home/index.html 控制台界面 创建个人工作目录及上传文件。点击概览页面顶端的 E-Shell 菜单栏,进入所连主机的 Shell 终端。在用户目录下新建个人工作目录,如:mkdir ywj2 安装MiniConda(推荐…

Ubuntu20.04 如何开启root账户登陆

环境: 电脑:戴尔7080 系统:Windows 10 专业版 64位 VMware 16.0 :Ubuntu20.04 问题描述: Ubuntu20.04 如何开启root账户登陆 解决方案: 1.以普通用户登录系统,创建root用户的密码 在终端…

Java代码审计——WebGoat XSS

目录 (一)XSS 常见触发位置 1.JSP 表达式 2.EL (二)反射型 XSS (三) 存储型 XSS (四)XSS 漏洞修复 配置过滤器: (一)XSS 常见触发…

HTML期末作业课程设计期末大作业__电影长津湖介绍带视频(6页)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 摄影作品 | 影视设计网页 | 在线电影 | 视频音频元素 | HTML期末大学生网页设计作业,Web大学生网页 HTML:结构 CSS&#xff1…

uiautomator2的安装,使用,在浏览器中查看页面的信息,简单快捷的ui测试工具,app测试工具(一)

uiautomator2的安装,使用,简单快捷的ui测试工具,app测试工具 安装方法 命令行中输入 pip install uiautomator pip install weditor在andriod studio中启动一个模拟器 启动 python -m weditor即可在浏览器看到弹出的窗口,里面…

【滤波跟踪】基于不变扩展卡尔曼滤波器对装有惯性导航系统和全球定位系统IMU+GPS进行滤波跟踪附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

核苷酸类化合物库 脂类化合物库参与细胞调控

核苷及核苷酸是机体内的一种重要的内源物质,参与细胞的多种生命进程,如 DNA 和 RNA 合成,信号转导及代谢等。核苷及核苷酸类似物是人工合成的,经过一定化学修饰的物质,可以模拟机体内核苷及核苷酸,参与细胞…

Git合并出现MERGING有效解决方法

Git合并出现MERGING有效解决方法错误描述解决办法参考链接错误描述 我在操作git合并时候意外出现了MERGING,很懵逼,如图所示: 遇到这个问题也是很头疼了,百度了很多方法有说是:“在命令行输入:git reset …

“以赛助教”进校园,CCF大数据与计算智能大赛成高校人才探索实践AI技术的第二课堂!

随着第十届CCF大数据与计算智能大赛(简称2022 CCF BDCI)的报名通道关闭、《大咖说系列专题报告》收官,“以赛助教”系列活动也正式宣告结束。 CCF大数据与计算智能大赛(CCF BDCI)由中国计算机学会于2013年创办&#x…

verilog 流水线控制

文章目录Verilog 流水线控制1、关键问题、实现方式及其对比2、实现方式2.1、控流水线输入:根据每一拍的 din_en_d* 打拍,没有最终的 else block2.2、控流水线输入:根据每一拍的 din_en_d* 打拍,有最终的 else block2.3、控流水线每…

真香!宝藏学习方式还可以这样,家人们绝不能错过

文 / 谷雨(微信公众号:王不留) 《谷雨:告诉大家一个小秘密》一文,辛苦码字半夜,阅读量却扑街,我想根本原因是标题名字起得太差。 前几天看了一个不知真假的截屏,说到小红书上的关键词…

Linux挂载Windows端NFS服务(实现板端Linux与PC互传文件)

Linux挂载Windows端NFS服务(实现板端Linux与PC互传文件) 1. kernel编译时打开NFS客户端服务 在宿主机打开kernel文件夹,先make clean,然后make menuconfig,进入配置界面: 使用/查找NFS,找到Ne…

终于有阿里P8从开发、运维两个角度总结出了Redis实战手册

从开发、运维两个角度总结了Redis实战经验,深入浅出地剖析底层实现,包含大规模集群开发与运维的实际案例、应用技巧。 前言Redis作为基于键值对的NoSQL数据库,具有高性能、丰富的数据结构、持久化、高可用、分布式等特性,同时Redi…

Windows10安装Docker(基于WSL2,包含WSL2安装教程)

WSL2 wsl是windows自带的功能,只需要开启Windows功能即可安装子系统 可以通过以下命令获取发行版名字 wsl --list --online通过以下命令安装 wsl --install -d ${发行版名字} 如 wsl --install -d Ubuntu-20.04安装后会弹出来子系统设置用户名密码 运行以下命令…

matlab解下列微分方程

解下列微分方程 &#xff08;1&#xff09;ydsolve(‘Dyxy’,‘y(0)1’,‘x’) y -x-12exp(x) x[1 2 3] x 1 2 3 -x-12exp(x) ans 3.4366 11.7781 36.1711 &#xff08;2&#xff09;x’2x3y,y’2xy,x(0)-2,y(0)2.8,0<t<10,做相平面图 新建M函数 function dyweifen1(…

d盘不见了怎么恢复?数据恢复,一键操作

d盘是我们日常生活中常用的一种硬盘&#xff0c;平时我们会用到 d盘来存储我们平时要用到的文件资料&#xff0c;如文档、图片、视频等。而由于我们日常使用它时都是在 Windows系统下&#xff0c;所以就很容易忽略 d盘的重要性了。当遇到 d盘不见的情况&#xff0c; d盘不见了怎…

php宝塔部署实战ptcms小说管理系统源码带采集规则

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 有个朋友发消息跟我说&#xff0c;他下载了一套ptcms的小说系统&#xff0c;在搭建的时候一直部署不好&#xff0c;这套系统还带有采集功能的&#xff0c;让我帮他看看&#xff0c;我抽空看了并测试了一下&#x…

【菜菜的sklearn课堂笔记】逻辑回归与评分卡-梯度下降求解逻辑回归

视频作者&#xff1a;菜菜TsaiTsai 链接&#xff1a;【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili 我们以最著名也最常用的梯度下降法为例。 现在有一个带两个特征并且没有截距的逻辑回归y(x1,x2)y(x_{1},x_{2})y(x1​,x2​)&#xff0c;两个特征…

【java】 对命名规范的思考——VO,BO,PO,DO,DTO是什么

作为Java开发人员免要接触VO&#xff0c;BO&#xff0c;PO&#xff0c;DO&#xff0c;DTO&#xff0c;但很多朋友对这些概念一直以来都是云里雾里&#xff0c;本来是规范性的东西&#xff0c;使用起来却反而导致更加混乱了。先附上我自己常用的命名习惯&#xff1a; 数据对象&…

IVIF:multi-scale densenet

UNFusion: A unified multi-scale densely connected network for infrared and visible image fusion &#xff08;UNFusion: 用于红外和可见光图像融合的统一多尺度密集连接网络&#xff09; 大多数基于深度学习的方法主要侧重于卷积操作来提取局部特征&#xff0c;但没有充…