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

相关推荐
TechMix38 分钟前
【性能工具】atrace、systrace、perfetto抓取的trace文件有何不同?
android·性能优化
张小潇43 分钟前
AOSP15 WMS/AMS系统开发 - 窗口层级源码分析
android·前端
努力努力再努力wz3 小时前
【MySQL入门系列】掌握表数据的 CRUD:DML 核心语法与执行逻辑解析
android·开发语言·数据结构·数据库·c++·b树·mysql
zh_xuan5 小时前
Android gradle任务
android·gradle构建
Grackers6 小时前
Android Perfetto 系列 10:Binder 调度与锁竞争
android·binder
李白你好6 小时前
Android 自动化渗透测试指令生成
android·自动化
CeshirenTester7 小时前
Claude Code 不只是会写代码:这 10 个 Skills,才是效率分水岭
android·开发语言·kotlin
朝星9 小时前
Android开发[2]:Flow
android·kotlin
zzb15809 小时前
Android Activity 与 Intent 学习笔记
android·笔记·学习
studyForMokey9 小时前
【Android面试】动画 & Bitmap
android·面试·职场和发展