当前位置: 首页 > 科技观察

AndroidSystemBinder详解

时间:2023-03-16 13:11:17 科技观察

本文转载自微信公众号《嵌入式Linux系统开发》,作者asonangel。转载本文请联系嵌入式Linux系统开发公众号。最近博主在研究Android系统的binder。什么是活页夹?可以理解为Andorid系统中进程间通信的一种方式。Android系统虽然基于Linux,但并没有使用Linux自带的进程间通信方式,而是使用了更高效的binder。理解binder对于理解Android系统有着至关重要的作用。Binder的原理图如下:Binder通信采用c/s架构,与Socket相同,只是稍微复杂一些。Binder组件包括Client、Server、ServiceManager和Binder驱动,其中ServiceManager用于管理系统中的各种服务。具体通信过程:Server首先向ServiceManager注册一个服务,其实是一个字符串。然后Client从ServiceManager中获取服务,关键字为注册的字符串。这样Client和Server就可以通信了。真正的数据流向是离开底层linux内核空间的binder驱动,但是这个是封装好的,所以不需要关心真正的binder驱动,只需要在Client和Server之间调用函数发送和接收数据即可。就是服务端的onTransact函数和客户端的remote()->transact(TEST,data,&reply)。发送的数据存放在data中,返回的数据存放在reply中。Client和Server都可以发送和接收数据。Android系统架构图:了解了binder之后,具体分析:binder驱动一定是在Linux内核底层,所以binder客户端和服务端可以存在于任何地方。示例:1.binderserver在app层,client在app层。2.binderserver在native层,client在app层。3.binderserver在app层,client在native层。4.binderserver在native层,client在native层。以上四种情况都可以。比较抽象,我贴了两篇文章链接,这两篇文章的代码我都验证过了,可以用。需要注意的是,APP层的binder是用java语言写的,native层的binder是用C++语言写的。但实际上界面非常相似。但是要看懂代码,需要先了解几个类:native层binder真正的继承关系如下:Symmetry可能更容易理解:我们主要继承自BnInterface和BpInterface来实现自己的server和client。bp:binderproxybn:bindernativesm:ServiceManager