Android IPC | Android多进程模式

embedded/2025/1/16 5:30:48/

前 言

关于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 @字节忍者


http://www.ppmy.cn/embedded/14572.html

相关文章

酷开科技生态内容价值+酷开系统的开放性和可塑性,实现品效合一

互联网浪潮之下&#xff0c;电视行业也迎来了新的机遇和挑战&#xff0c;酷开科技坚持以用户为中心&#xff0c;想用户所想&#xff0c;急用户所急&#xff0c;抓核心科技&#xff0c;为消费者提供优质、便捷的产品和服务&#xff0c;切实解决用户电视使用痛点&#xff0c;得到…

vue项目的Husky、env、editorconfig、eslintrc、tsconfig.json配置文件小聊

一、Git配置文件 1、Husky Husky 是一款管理 git hooks 的工具&#xff0c;可以帮助我们触发git提交的各个阶段&#xff1a;pre-commit、commit-msg、pre-push&#xff0c; 有助于我们在项目开发中的git规范和团队协作。 .husky文件通常包含以下内容&#xff1a; pre-commi…

基于RK3588的全国产鸿蒙边缘计算工控机在智能交通ETC收费系统的应用

1.1 产品简介 基于智能交通、工业互联等行业快速智能化发展的需求&#xff0c;以 OpenHarmony 为框架开发嵌入 HamonyOS&#xff0c;打造了具有高智能、高可靠、高安全的自主 可控的边缘处理器 XM-RK3588。 图 1-1 边缘处理器 HamonyOS强化 IoT 互联互动能力&#xff0c;让边缘…

Xbar控制图的定义和应用

1、定义 Xbar控制图&#xff08;X-Bar Chart&#xff09;是一种统计图表&#xff0c;用于展示数据分布情况。它通过绘制一系列数据点在均值线&#xff08;通常为X轴&#xff09;周围的分布情况来显示数据的波动性。这种图表可以用来监控生产过程、质量管理、金融分析等多个领域…

flutter组件 ThemeData

这里只讲组件的定义&#xff0c;需要各位自己去尝试。 ThemeData({// 常规配置Iterable<Adaptation<Object>>? adaptations, // 定义主题自适应方案的列表。bool? applyElevationOverlayColor, // 是否应用海拔叠加颜色。NoDefaultCupertinoThemeData? cuperti…

设计模式之装饰器模式

1、详细介绍 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许向一个现有的对象添加新的功能&#xff0c;同时保持对象的类结构不变。装饰器模式通过创建一个装饰器类&#xff0c;包裹原有的对象&#xff0c;并在保持接口一致的前提…

浅析Java中的LinkedList和ArrayList特点和底层

本期经验 LinkedList适合于删除和插入元素的操作&#xff0c;对首元素和尾元素的删除和修改插入极好&#xff0c;ArrayList适合于元素的修改和查询。 LinkedList LinkedList的底层使用双向链表来写&#xff0c;这导致其每次查询和修改元素都必须从首元素开始以此往下找&…

Flutter 项目添加 IOS 小组件开发记录

突然接到一个需求&#xff0c;需要我们在 IOS APP 中添加 widget 小组件&#xff0c;用来展示项目项目数据信息。大领导的需求没法拒绝&#xff0c;只能摸着石头过河&#xff0c;开干&#xff01; 环境安装 由于项目用的是 Flutter 来搭建的&#xff0c;所以需要申请台 mac 电…