多进程及Binder机制

Android多进程这玩意嘛,说真的,平时接触的不多,更别说在正式项目上使用了,也就看书看博客的时候了解了用法,然后面试笔试会问到而已,但为了加深对Android各种机制的理解,今天还是来聊聊多进程之Binder吧。

1、IPC、LPC、RPC

首先我们还是先来搞清这几个概念:
A:IPC(Inter-Process Communication),也就是进程间通信
B:LPC(Local Procedure Call),也就是本地过程调用(单台机器,本地工作)
C:RPC(Remote Procedure Call),也就是远程过程调用(多台机器,网上工作)
D:IPC包含了LPC和RPC两种类型的进程间通信

2、Android开启多进程的方法:

在AndroidManifest.xml中声明组件时,用android:process属性来指定。
适用的元素:Application, Activity, BroadcastReceiver, Service, ContentProvider
如果不值定process属性,则默认运行在主进程中,主进程名字为包名。
android:process = :xxxxx ,将运行在默认包名:xxxxx 进程中,而且是APP的私有进程,不允许其他APP的组件来访问。
android:process = [小写字母开头],表示这个进程为全局进程,可以被多个APP共用。

3、Android开启多进程的好处:

A:增加App可用内存(现在手机内存都较大,若单纯只想增大APP可用内存,可考虑配置largeHeap)
B:独立于主进程(用来确保某些任务的执行和完成)

4、多进程引发的问题:

A:静态成员和单例失效:每个进程保持各自的静态成员和单例,相互独立。
B:线程同步机制失效:每个进程有自己的线程锁。
C:SharedPreferences可靠性下降:不支持并发写,会出现脏数据。
D:Application多次创建:不同进程跑在不同虚拟机,每个虚拟机启动会创建自己的Application,自定义Application时生命周期会混乱。
E:SQLite容易被锁,如果两个进程同时对数据库操作,则会发生SQLiteDatabaseLockedException等异常

5、Linux关于多进程的基础概念——引出Binder

A:Linux的虚拟内存机制导致内存的隔离,进而导致进程隔离
B:进程隔离的出现导致对内存的操作被划分为用户空间和内核空间
C:用户空间需要跨权限去访问内核空间,必须使用系统调用去实现
D:系统调用需要借助内核模块/驱动去完成
E:Binder驱动就是内核模块/驱动中用来实现进程间通讯的

6、为什么要用Binder?

众所周知,Android 系统是基于 Linux 内核的,Linux 已经提供了管道、消息队列、共享内存和 Socket 等 IPC 机制。那为什么 Android 还要提供 Binder 来实现 IPC 呢?主要是基于性能、稳定性和安全性几方面的原因。

各种IPC方式数据拷贝次数

如上图(侵删)所示,我们稍微总结一下:
A:Socket 作为一款通用接口,其传输效率低,开销大,主要用在跨网络的进程间通信和本机上进程间的低速通信。
B:消息队列和管道采用存储-转发方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。
C:共享内存虽然无需拷贝,但控制复杂,难以使用。
D:Binder 只需要一次数据拷贝,性能上仅次于共享内存。
最后,我们用以下一张图(侵删)来总结Binder 的优势

Binder 的优势
7、Binder通信模型

首先在理解模型之前先熟悉这几个概念:
●Client进程:跨进程通讯的客户端(运行在某个进程)
●Server进程:跨进程通讯的服务端(运行在某个进程)
●Binder驱动:跨进程通讯的介质
●ServiceManager:跨进程通讯中提供服务的注册和查询(运行在System进程)

Binder通信模型

又盗了一张图(侵删),说实话第一眼看到这一张图,我就想起了最近后端开发超火的微服务,这模型简直是一样一样的啊,后来查了一下,阿里的dubbo确实也是基于这样的模型的(RPC嘛)。
我们还是简单描述一下整个过程:
A:Server端通过Binder驱动在ServiceManager中注册
B:Client端通过Binder驱动获取ServiceManager中注册的Server端
C:Client端通过Binder驱动和Server端进行通讯

8、Binder通信原理
image.png

又盗一张图(侵删,原作者图画得太赞了),梳理Binder的通讯原理:
A:Service端通过Binder驱动在ServiceManager的查找表中注册Object对象的add方法
B:Client端通过Binder驱动在ServiceManager的查找表中找到Object对象的add方法,并返回proxy对象的add方法,add方法是个空实现,proxy对象也不是真正的Object对象,是通过Binder驱动封装好的代理类的add方法
C:当Client端调用add方法时,Client端会调用proxy对象的add方法,通过Binder驱动去请求ServiceManager来找到Service端真正对象,然后调用Service端的add方法

9、理解Binder对象和Binder驱动

●Binder对象:Binder机制中进行进程间通讯的对象,对于Service端为Binder本地对象,对于Client端为Binder代理对象
●Binder驱动:Binder机制中进行进程间通讯的介质,Binder驱动会对具有跨进程传递能力的对象做特殊处理,自动完成代理对象和本地对象的转换

10、Android系统中Binder的应用

首先,我们来说一下AMS(ActivityManagerService),它可以说是Android应用的最关键最和谐的一个service,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,而我们再来看看AMS中的Binder体系,如下图(侵删):

AMS中的Binder体系

正是因为AMS中有了Binder机制的支持,我们的四大组件才拥有着跨进程通讯的能力,下面我们逐一进行说明:
A:Activity,通过Action来指定别的进程中的Activity,举个简单的例子,比如打电话
B:ContentProvider,通过Uri.parse("content://authorities")来访问别的APP的共享数据
C:BroadcastReceiver,也是通过Action来指定及过滤的,是一种被动跨进程通讯的方式
D:Service,最典型的例子就是AIDL服务,当然还有Messenger(基于AIDL实现的)

这么说吧,Binder机制在整个Android系统中占着非常重要的地位,举个最简单的例子,APP中的Activity启动startActivity,这一过程都能找到Binder机制的身影,详情请看下图(侵删):

startActivity中的Binder

PS:本文只为笔者学习记录,大量参考下面文章:
https://blog.csdn.net/qq_30379689/article/details/79451596
https://www.cnblogs.com/baronzhang/p/8784458.html
https://www.cnblogs.com/cocoabird/p/8392274.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容