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

相关推荐
工业甲酰苯胺2 分钟前
MySQL 主从复制之多线程复制
android·mysql·adb
少说多做34313 分钟前
Android 不同情况下使用 runOnUiThread
android·java
Estar.Lee2 小时前
时间操作[计算时间差]免费API接口教程
android·网络·后端·网络协议·tcp/ip
找藉口是失败者的习惯2 小时前
从传统到未来:Android XML布局 与 Jetpack Compose的全面对比
android·xml
Jinkey3 小时前
FlutterBasic - GetBuilder、Obx、GetX<Controller>、GetxController 有啥区别
android·flutter·ios
大白要努力!5 小时前
Android opencv使用Core.hconcat 进行图像拼接
android·opencv
天空中的野鸟6 小时前
Android音频采集
android·音视频
小白也想学C7 小时前
Android 功耗分析(底层篇)
android·功耗
曙曙学编程7 小时前
初级数据结构——树
android·java·数据结构
闲暇部落9 小时前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin