Android--Binder

一、Binder的基础知识

Binder的三个知识点:
1、Binder的进程间通信机制
2、Binder驱动,dev/binder(linux一切皆文件)
3、Binder的Binder.java类(实现了IBinder,就有了跨进程的能力)

一次完整的Binder访问:
在这里插入图片描述
很多app是多进程的,webview,保活,推送,加载图片自己都可以创建进程,如果使用服务,比如闹钟和电话服务,也是跨进程的。多进程的优点就是扩大内存,因为单个进程(每个进程分配一个虚拟机)的内存是有限的,每个手机厂商不同;多进程的优点还有如果一个是隔离风险,比如加载大图,单独用一个进程,进程崩溃了,不会让整个app崩溃。handler是线程间的通信机制,binder是进程间的通信机制。

二、 Android创建binder的原因,有什么优势?

linux的进程间通信机制有:共享内存,管道,socket,信号量。传统IPC中socket和管道、信号量类似。

在这里插入图片描述

三、进程间如何通信?

1、内存划分:
在这里插入图片描述虚拟内存远大于物理内存

2、传统IPC机制流程如图:
在这里插入图片描述
3、Binder的IPC:

在这里插入图片描述

内核空间的虚拟内存接收方的用户空间的虚拟内存同时映射在同一块物理空间,是通过MMAP实现的。

四、MMAP

1、传统的流程
用户空间不能直接对文件进行读写,所有系统的资源管理都是在内核空间完成的,两次cope,如图:

在这里插入图片描述
2、MMAP
在这里插入图片描述

五、Binder机制如何跨进程的?

在这里插入图片描述简单概括:

1、数据发送方通过copy_from_user()把数据发送到内核空间
2、binder驱动会创建一个物理内存,让内核空间和接收方用户空间同时映射到这块物理内存
3、也就是说发送方把数据copy_from_user()来把数据cope到内核空间之后,数据就直接到了接受方的用户空间。binder只需要一次cope就完成了进程间的通信。

六、Android中怎么使用binder?描述AIDL生成的java类细节?

1、什么是AIDL?

AIDL是Android接口定义语言,通过AIDL的工具,生成JAVA代码。

https://www.jianshu.com/p/88ddb543265e

1、通过asInterface判断是否在同一个进程
2、transact会挂起线程
3、reply打包数据返回
4、服务端的接收运行在binder线程

七、四大组件是如何跨进程的?比如广播

也是通过binder,如图:

在这里插入图片描述简化图:
在这里插入图片描述

在客户端调用binderService(),通过ServiceManager(系统服务类,也是一个服务,是一个binder对象)拿到AMS对象的句柄。

跨了六次进程

后续我补上源码分析。

附:https://www.jianshu.com/p/8b1d9c86fa84
https://www.cnblogs.com/qingchen1984/p/5212755.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值