Android IPC | Android多进程模式

前 言

关于Android的进程间通信(即IPC)有很多种方式,比如我们常用的AIDL、Socket等,而其中最重要而且最需要掌握的就是AIDL的使用和原理,简单来说它是通过Binder实现的。

关于Binder的知识点非常多,当我们阅读一些系统源码时,如果不了解Binder的话,就难以读懂不同进程之间的合作和通信,可以说是Binder实现的IPC方式是整个Android系统不同进程通信的核心

Android IPC 简介

IPC就是Inter-Process Communication的缩写,含义为进程间通信或者跨进程通信,何为通信也就是俩个进程之间进行数据交换的过程。

进程和线程

既然说到跨进程通信,那什么是进程,进程和线程是完全不同的概念。按照操作系统的描述,线程是CPU调度的最小单元,同时线程是一种有限的系统资源。

这里或许有刚入门的同学不理解什么是CPU调度的最小单元这句话,我们直接看一张图:

图片

由于CPU数量有限且运行速度非常快,所以可以多个线程同时给一个CPU来执行,由于不断的切换,看起来线程就跟一直在运行一样。

而进程一般指的是一个执行单元,比如在PC和移动设备中,一般指的就是一个应用。而且一个进程可以包含多个线程,所以进程和线程是包含与被包含的关系。

Android IPC方式

当然不仅仅是Android系统,任何一个系统都需要相应的IPC机制。比如Windows上可以通过剪贴板、管道等来实现进程间通信;而Linux可以通过管道、信号量来实现进程间通信,可以看到不同的系统有不同的IPC方式。

而Android系统作为基于Linux内核的操作系统,它的通信方式并没有完全继承Linux,而是创建了一个特殊的通信方式:Binder,通过Binder可以轻松实现通信;关于Binder的内容,后面文章会花很大篇幅仔细介绍,除了Binder就还有Socket也可以实现任意俩个终端之间的通信

多进程的优势

在Android中需要IPC有俩种情况,一种是多个APP之间通信,这种需求场景在定制系统中比较多,比如车机、电视、手机系统,经常就有Launcher应用需要得到其他应用比如导航、音乐应用的信息并且展示出来;

还有一种就是一个APP也可以开启多进程,而这种在比较大型的APP中使用的非常多,比如下图:

图片

这里发现QQ、微信、知乎等都有多个进程在运行,那为什么一个APP要设置多进程呢,大概有如下几个原因:

  1. 突破进程内存限制。Android系统会为每个应用分配一定的内存,但是有些功能十分消耗内存,比如查看图片这种功能,这时为了防止该功能导致应用内存过多导致OOM,可以把该功能单独拎出来,在单独进程中进行,这样就可以获取双份内存,突破了单一应用的内存限制。

  2. 功能稳定性,独立的通信进程保持长连接的稳定性。比如各个手机应用的推送功能,一般都会单独开启一个进程,来保证其稳定性。

  3. 避免内存泄漏。这里比较常见的做法就是把WebView单独放到一个进程中给隔离起来,避免WebView发生内存泄漏导致APP主进程内存泄漏。

  4. 隔离风险。对于不稳定的功能可以放入独立进程,这样可以避免不稳定的功能发生崩溃导致主APP也崩溃。

Android 多进程模式

对于多个APP而言,之间的数据天生就是不共享的,因为进程隔离。而对于单一APP来说,开启多进程的方式也只有一个,而且非常方便。

开启多进程

应用开启多进程的方法有且仅有一个就是在Manifest中设置四大组件的process属性即可,如下所示:

<activity    android:name=".ThirdActivity"    android:exported="false"    android:process="com.zyh.ipc.process2"    /><activity    android:name=".SecondActivity"    android:exported="false"    android:process=":process1"    />

其中对SecondActivity设置的process值为":process1",而对ThirdActivity设置的值是全名,上述APP在设置后,运行结果如下:

图片

可以发现这里多了俩个进程信息。

这里可以注意到设置process的方式是不一样的,其中以:process1设置的进程属于当前应用的私有进程,其他应用组件不可以和它跑在一个进程中;而以全包名的方式设置进程,则是属于全局进程,其他应用通过ShareUID的方式可以和它跑在同一个进程中。

多进程的限制

虽然开启多进程方式非常简单,但是一旦开启了多进程就会出现一系列问题,大概有如下几个方面:

  1. 静态成员和单例模式完全失效

  2. 线程同步机制完全失效

  3. SharedPreference的可靠性下降

  4. Application会多次创建

这是因为在Android系统中,会为每一个进程都分配一个虚拟机,所以当A、B俩个Activity运行在不同的进程中时,虽然都可以访问同一个类的静态变量,但是访问的却是类的副本,所以会导致静态成员和单例完全失效

既然单例和成员变量都会失效,那同步机制中的锁也会不可靠,而且还会导致Application会创建多次。

总   结

本篇文章主要介绍了一些IPC的基本概念,其实对于有Android系统开发或者厂商应用开发的开发者来说,IPC可是很重要的知识。

虽然单应用使用多进程有诸多好处,但是也有很多问题,所以后续文章会深入剖析各种IPC方式的原理,让我们攻克这部分难点。

笔者水平有限,如有问题,欢迎大家评论指正。

From @字节忍者

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

libtorrent - 安装小记

文章目录 官方文档&#xff1a;libtorrent python binding http://libtorrent.org/python_binding.html 1、下载代码 建议使用&#xff1a; git clone --recurse-submodules https://github.com/arvidn/libtorrent.git如果在 github web 界面下载代码&#xff0c;build 的时候…

sentinel-1.8.7与nacos-2.3.0实现动态规则配置、双向同步

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; sentinel-1.8.7与nacos-2.3.0实现动态规则配置、双向同步 ⏱️ 创作时…

FL Studio21.2中文破解版下载2024最新五月破解步骤教程

FL Studio 21.2.3.4004中文版 中文别名水果编曲软件&#xff0c;是一款全能的音乐制作软件&#xff0c;包括编曲、录音、剪辑和混音等诸多功能&#xff0c;让你的电脑编程一个全能的录音室&#xff0c;它为您提供了一个集成的开发环境&#xff0c;使用起来非常简单有效&#xf…

MATLAB命令

MATLAB是一个用于数值计算和数据可视化的交互式程序。您可以通过在命令窗口的MATLAB提示符 ‘>>’ 处键入命令来输入命令。 在本节中&#xff0c;我们将提供常用的通用MATLAB命令列表。 用于管理会话的命令 MATLAB提供了用于管理会话的各种命令。下表提供了所有此类命令…

基于springboot+vue+Mysql的CSGO赛事管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

京东商品差评获取

1.背景 场景一&#xff1a;一个市场研究员或者是一个企业的产品经理&#xff0c;需要下载差评来了解消费者对于某一产品或者服务的不满&#xff0c;以便改进他们的产品或服务。 场景二&#xff1a;一个人是某个企业的竞争对手&#xff0c;需要下载差评来了解他们的竞争对手的…

java自动生成pojo,springboot自动生成pojo

第一步 pom引入依赖 <dependencies><!-- mybatis-generator --><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.3.7</version></dependency>&…

乒乓球廉价底板及套胶评测5

今天给同事贴一个银河t2底板&#xff0c;正手狂39度&#xff0c;反手拍里奥&#xff0c;银河t2是碳板&#xff0c;考虑到使用的长期性&#xff0c;没有灌油&#xff0c;用的无机胶水。 这套装备本身没有什么瑕疵&#xff0c;主要还是考虑正手狂三的通透性&#xff0c;我认为有…

QML 中的状态

Qt hello – 专注于Qt的技术分享平台 状态描述了当前用户界面样子&#xff0c;QML中一个状态定义了一组属性的改变&#xff0c;并且会在一定条件下被触发。 假设有这么一个场景&#xff0c;红黄绿三个灯&#xff0c;用一个按钮&#xff0c;点击后依次切换三个灯亮起。使用QWi…

【C++干货基地】深度理解C++中的高效内存管理方式 new delete

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

星松云新品边缘计算路由器,上网收益两不误

随着互联网的普及和发展&#xff0c;人们对于网络带宽和稳定性的需求日益增加&#xff0c;而同时&#xff0c;对于网络使用的成本也变得越来越重要。在这样的背景下&#xff0c;星松云推出了全新的边缘计算路由器&#xff0c;为用户带来了一个既能享受高速网络&#xff0c;又能…

设计模式(六):原型模式

设计模式&#xff08;六&#xff09;&#xff1a;原型模式 1. 原型模式的介绍2. 原型模式的类图3. 原型模式的实现3.1 创建一个原型接口3.2 创建具体原型3.3 创建一个数据缓存类3.4 测试 1. 原型模式的介绍 原型模式&#xff08;Prototype Pattern&#xff09;属于创建型模式&…

2024 年 Rust 开发者路线图

Rust 近年来因其对性能、安全性和并发性的关注而广受欢迎。作为一名开发人员&#xff0c;掌握 Rust 可以为各种机会打开大门&#xff0c;包括 Web 开发。 在 github 上发现了这个优秀的路线图&#xff0c;由 Anshul Goyal 创建&#xff0c;它提供了一条全面的路径&#xff0c;概…

在RISC-V64架构的CV1811C开发板上应用perf工具进行多线程程序性能分析及火焰图调试

CV1811C环境编译 SDK目录结构 . ├── build // 编译目录,存放编译脚本以及各board差异化配置 ├── buildroot-2021.05 // buildroot开源工具 ├── freertos // freertos系统 ├── fsbl // fsbl启动固件,prebuilt形式存在…

【漏洞复现】通天星CMSV6车载监控平台Druid弱口令漏洞

漏洞描述: 通天星CMSV6车载定位监控平台拥有以位置服务、无线3G/4G视频传输、云存储服务为核心的研发团队,专注于为定位、无线视频终端产品提供平台服务,通天星CMSV6产品覆盖车载录像机、单兵录像机、网络监控摄像机、行驶记录仪等产品的视频综合平台。 通天星CMSV6车载视…

网络爬虫之HTTP原理

** URI和URL URI的全称Uniform Resource Identifier &#xff0c;即统一资源标志符。URL的全称Uniform Resource Locator 即统一资源定位符。 URL是URI的子集&#xff0c;也就是每一个URL就是URI&#xff0c;但是每一个URI不一定是URL&#xff0c;URI还有一个子类叫URN&#x…

AutoGPT-Forge使用教程,自行构建agent智能体

本博客给出AutoGPT-forge四个教程的翻译与理解&#xff0c;使用GPT4翻译&#xff0c; 参考官方教程https://aiedge.medium.com/autogpt-forge-a-comprehensive-guide-to-your-first-steps-a1dfdf46e3b4 使用AutoGPT Github代码日期2024/4/22&#xff1b; 博客开始编辑日期20…

计算机毕业设计springboot市场摊位管理系统【附源码】

基于JavaWeb开发的springboot市场摊位管理系统 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &#…

JS 添加数组元素( 4种方法 )

No.内容链接1Openlayers 【入门教程】 - 【源代码示例300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3Cesium 【入门教程】 - 【源代码图文示例200】 4MapboxGL【入门教程】 - 【源代码图文示例150】 5前端就业宝典 【面试题详细答案 1000】 文章目录 一、四种…

HTTP/1.1,HTTP/2.0和HTTP/3.0 各版本协议的详解(2024-04-24)

1、HTTP介绍 HTTP 协议有多个版本&#xff0c;目前广泛使用的是 HTTP/1.1 和 HTTP/2&#xff0c;以及正在逐步推广的 HTTP/3。 HTTP/1.1&#xff1a;支持持久连接&#xff0c;允许多个请求/响应通过同一个 TCP 连接传输&#xff0c;减少了建立和关闭连接的消耗。 HTTP/2&#…