Android Framework学习笔记之Binder

Android Framework学习笔记之Binder

在这里插入图片描述

Linux进程间通信的方式: 管道(Pipe)、信号(Signal)、消息队列(Message)、共享内存(Share Memory)、套接字(Socket、中断 Binder: Binder 通信机制是在OpenBinder的基础上实现的,采用CS通信方式。 OpenBinder是一种进程间通信机制,它最初是由Be公司开发的,后来由Palm公司接手开发和维护,最后Google公司对其进行改造,并应用在Android系统中。

1、系统服务是用过getSystemService获取的服务,应用程序服务是通过继承Service,程序员自己创建的 2、Android的SDK中提供了aidl工具,该工具可以讲aidl文件转换为一个java类文件;例如我们定义一个IServer.aidl文件,aidl工具会自动生成一个IServer.java的java接口类(包含Stub,Proxy等内部类)。 3、前台进程通过bindService绑定后台服务进程时,onServiceConnected(ComponentName name, IBinder service)传回IBinder对象,并且可以通过IServer.Stub.asInterface(service)获取IServer的内部类Proxy的对象,其实现了IServer接口 4、前台进程实际上市通过Proxy实现的IServer接口方法,将方法名、参数传递给后台服务进程。 5、我们还需要继承Service,创建自己的后台服务进程,并且在其中实现IServer接口类,提供IServer的具体服务。并实现Service的onBind方法。

优点: 1、安全,传统的IPC(套接字、管道、消息队列)的安全机制依赖上层协议;例如: a、Android为每个安装好的应用程序分配了自己的UID,故进程的UID是鉴别进程身份的重要标志。 b、传统IPC的接收方无法获得对方进程可靠的UID/PID(用户ID/进程ID),从而无法鉴别对方身份。    c、使用传统IPC只能由用户在数据包里填入UID/PID,但这样不可靠,容易被恶意程序利用,故可靠的身份标记只有由IPC机制本身在内核中添加。 d、其次传统IPC访问接入点是开放的,无法建立私有通道。比如命名管道的名称,system V的键值,socket的ip地址或文件名都是开放的,只要知道这些接入点的程序都可以和对端建立连接,不管怎样都无法阻止恶意程序通过猜测接收方地址获得连接。 2、性能高:传统的IPC(套接字、管道、消息队列)需要拷贝两次内存、Binder只需要拷贝一次内存、共享内存不需要拷贝内存。
在这里插入图片描述

image.png

用户空间与内核空间: 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。

操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。

为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。
在这里插入图片描述

针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。
在这里插入图片描述

image.png
在这里插入图片描述

image.png

MMAP: 一种是open一个文件,然后使用read系统调用读取文件的一部分或全部。

这个read过程是这样的:内核将文件中的数据从磁盘区域读取到内核页高速缓冲区,再从内核的高速缓冲区读取到用户进程的地址空间。这里就涉及到了数据的两次拷贝:磁盘->内核,内核->用户态。

而且当存在多个进程同时读取同一个文件时,每一个进程中的地址空间都会保存一份副本,这样肯定不是最优方式的,造成了物理内存的浪费。
在这里插入图片描述

image.png

open一个文件,然后调用mmap系统调用,将文件的内容的全部或一部分直接映射到进程的地址空间,映射完成后,进程可以像访问普通内存一样做其他的操作,比如memcpy等等。

mmap并不分配物理地址空间,它只是占有进程的虚拟地址空间。这跟普通方式不一样的,普通方式需要预先分配好物理内存,内核才能将页高速缓冲中的文件数据拷贝到用户进程指定的内存空间中。

当多个进程需要同时访问同一个文件时,每个进程都将文件所存储的内核高速缓冲映射到自己的进程地址空间。

当第一个进程访问内核中的缓冲区时候,前面讲过并没有实际拷贝数据,这时MMU在地址映射表中是无法找到与地址空间相对应的物理地址的,也就是MMU失败,就会触发缺页中断。内核将文件的这一页数据读入到内核高速缓冲区中,并更新进程的页表,使页表指向内核缓冲中的这一页。之后有其他的进程再次访问这一页的时候,该页已经在内存中了,内核只需要将进程的页表登记并且指向内核的页高速缓冲区即可。如下图所示:
在这里插入图片描述

image.png
在这里插入图片描述

image.png
在这里插入图片描述

image.png

后文

更多Android Framework学习资料,可以扫描下方二维码免费领取!

Android Framework学习指南,全家桶学习资料(含 Framework 开发揭秘、内核解析及高频面试真题)

Framework 即应用框架层,是 Android 架构 的关键组成部分,为我们开发应用程序提供了非常多的API,使得开发者通过简单调用API即可开始APP的开发,而不用详细了解 Android 系统纷繁复杂的底层知识。

为帮助大家了解 Framework 在整个 Android 架构中的功能与构造,系统的学习和掌握Android framework,这里特意联合了阿里P7架构师和谷歌技术团队共同整理了一份 Android framework 全家桶学习资料。

内容概要:《Android Framework 开发揭秘》;Android Framework 高频面试题总结;Android Framework 精编内核解析;Android 11.0 最新 Framework解析。

内容特点:条理清晰,含图像化表示更加易懂。

由于文章内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要《Android Framework进阶学习指南》完整文档的可扫描下方卡片免费获取~

《Android Framework 开发揭秘》

目录

imgimg

第一章 系统启动流程分析

​ ● 第一节 Android启动概览

​ ● 第二节 init.rc解析

​ ● 第三节 Zygote

​ ● 面试题

img

第二章 Binder解析

​ ● 第一节 宏观认识Binder

​ ● 第二节 binder的jni方法注册

​ ● 第三节 binder驱动

​ ● 第四节 数据结构

​ ● 第五节 启动service_manager

​ ● 第六节 获取service_manager

​ ● 第七节 addService流程

​ ● 第八节 Binder面试题全解析

img

第三章 Handler解析

​ ● 第一节 源码分析

​ ● 第二节 难点问题

​ ● 第三节 Handler常见面试题

img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值