首页 > 其他分享 >安卓笔记—binder

安卓笔记—binder

时间:2024-08-13 17:23:01浏览次数:9  
标签:code Parcel int 安卓 笔记 对象 binder 进程

binder的c实现代码我没有读,下面的笔记都是从文章中学习的
https://elinux.org/Android_Binder

binder有哪些功能?

  1. 跨进程传输数据,跨进程传递时机。
    进程是分配内存的最小单位,因此进程间不共享内存。但是内核与进程之间是一对多的关系,也就是一个内核对应多个进程,因此binder通过函数copy_from_user把进程A的数据复制到内核空间,通过函数copy_to_user把内核的数据复制到进程B,完成进程间数据传递。
  2. 将不同进程的同一个binder对象做映射。
    进程B只有拿到进程A的binder对象,才能使用这个对象来跨进程调用A的函数。
    进程A中的binder对象xa通过上面的方式被传递到进程B,实际上是在进程B的内存中新建了一个binder对象xb。对象xa和对象xb是不同的进程,不同的内存,怎么能叫同一个binder对象呢?因为每次进程A将对象xa传给进程B时,进程B收到的都是对象xb。这样进程B第二次接收到对象xb时,B就有能力说:“是你上次要启动的服务吧,服务已经启动好了,这是可以调用服务的binder,请收好”,这句话看似是进程B和对象xb说的,其实是进程B和对象xa说的。起到一个身份识别的作用。
    进程B将对象xb跨进程传给进程C时,进程C每次收到也都是同一个对象xc。那么当进程C将xc传给进程A的时候,进程A接收到的必然是对象xa。这映射是如何实现的呢?binder自有他的办法,反正也不难实现,我就不纠结了。
  3. 将跨进程操作伪装成函数调用,方便程序员使用

如果不跨进程,那么调用一个接口的方式是:

caller 
-> 接口函数 //interface
-> 接口函数的实现 //callee,接口函数的用户实现

直接使用binder进行跨进程通信,函数调用如下

//进程B的caller,利用xb对象
caller
-> IBinder.transact(int code, Parcel data, Parcel reply, int flags)  //IBinder接口函数
-> BinderProxy.transact(int code, Parcel data, Parcel reply, int flags) //IBinder接口函数的实现
-> BinderProxy.transactNative(int code, Parcel data, Parcel reply, int flags) // native方法,下接binder驱动
-> binder驱动,真正的IPC发生在这里 //切换到进程A,也切换到xa对象
-> Binder.onTransact(int code, @NonNull Parcel data, @Nullable Parcel reply, int flags) // 回调接口
-> callee // 接口函数的用户实现,也是caller真正想要调用的函数
// 其中函数中的参数code可以用来对应不同的函数,比如:
// onTransact接收到code是1时,从data中读一个int,并调用 M1(int i)函数
// onTransact接收到code是2时,......

这里比较机械繁琐的就是:
调用IBinder.transact时需要把函数名字转换成code,然后把参数序列化
实现Binder.onTransact时需要把code转化成函数名字,然后把参数反序列化

使用aidl的目的就是可以自动生成code和函数的转化代码,以及参数和返回值的序列化与反序列化代码,也就是proxy类和stub类,函数调用如下

//进程B的caller,利用xb对象
caller // new proxy对象时要传入xb对象,这样才能赋予proxy跨进程能力
-> Stub.Proxy.M1 //参数code由stub.proxy.M1函数负责传入一个能唯一代表M1的数字,利用xb对象
-> IBinder.transact(int code, Parcel data, Parcel reply, int flags)  //IBinder接口函数
-> BinderProxy.transact(int code, Parcel data, Parcel reply, int flags) //IBinder接口函数的实现
-> BinderProxy.transactNative(int code, Parcel data, Parcel reply, int flags) // native方法,下接binder驱动
-> binder驱动,真正的IPC发生在这里 //切换到进程A,也切换到xa对象
-> Binder.onTransact(int code, @NonNull Parcel data, @Nullable Parcel reply, int flags) // 回调接口
-> Stub.onTransact(int code, @NonNull Parcel data, @Nullable Parcel reply, int flags) // 自动生成的接口实现,会根据code调用不同的函数
-> Stub.M1 //callee,接口函数的用户实现,也是caller真正想要调用的函数

stub有静态函数asInterface,接受binder对象,然后帮你new一个proxy
proxy有asBinder方法,返回binder对象

  1. 维护引用关系,防止xa对象被gc

    进程B刚拿到对象xb时,xa会被弱引用,当进程B调用了xb/xa的函数后,xa会被强引用,防止被gc。

  2. 提供接口判断进程A是否还在,提供接口接受进程A结束的消息
public boolean pingBinder();
public boolean isBinderAlive();
public void linkToDeath(DeathRecipient recipient, int flags)
  1. binder线程池
    上面的Binder.onTransact的回调函数不是在进程A的主线程回调的,而是在进程A中有一个线程池专门用于接受onTransact回调

标签:code,Parcel,int,安卓,笔记,对象,binder,进程
From: https://blog.csdn.net/doubledong1994/article/details/141114499

相关文章

  • 【笔记】从0开始的代码审计
    【笔记】从0开始的代码审计代码审计思路敏感函数回溯参数调用过程首先特别关注程序敏感函数点,如:SQL语句拼合处、call_user_func、eval、unserialize、HTTP_CLIENT_IP等然后回溯参数调用过程查看是否全部过滤或者过滤不全,如:程序可能开启magic_quotes_gpc(转义大部分符号),但是部......
  • 打工笔记--------------------------c#实现串口通信
    串口通信原理串口通信(SerialCommunications)的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一......
  • 【笔记】吉如一线段树
    【笔记】吉如一线段树吉如一论文(CQBZ内网,在PDF的103页1区间最值操作1.1区间取min(max),区间和当前应该修改值为\(x\);维护区间最大值\(mx\),最大值个数\(t\),严格次大值\(se\)。如果走到一个区间上,如果:\(x\gemx\),说明取min操作没用,直接return;\(mx>x>se\),打标......
  • VisionPro二次开发学习笔记13-使用CogToolBlock进行图像交互
    该程序演示了如何使用CogToolBlock进行图像交互.从vpp文件中加载一个ToolBlock。用户可以通过应用程序窗体上的数字增减控件修改ToolBlock输入端子的值。用户还可以从coins.idb或采集FIFO中选择图像。“运行一次”按钮执行以下操作:获取下一个图像或读取下一个图像......
  • 算法的学习笔记——二进制中 1 的个数(牛客JZ15)
    ......
  • CSS笔记总结(Xmind格式):第二天
    Xmind鸟瞰图:简单文字总结:css知识总结:复合选择器:  1.交集选择器:在一个选择器的基础上,再增加一个选择器来增加条件(中间不能有任何符号包括空格)  2.并集选择器:多个选择器之间用逗号隔开,表示同时选择多个标签使用样式  3.后代选择器:使用空格分隔  4.子元......
  • JavaScript高阶笔记总结(Xmind格式):第三天
    Xmind鸟瞰图:简单文字总结:js高阶笔记总结:严格模式:  1.开启严格模式:"usestrict"  2.不使用var关键字声明会报错  3.严格模式下普通函数的this指向undefined高阶函数:  满足其中之一即高阶函数:    1.函数作为参数    2.函数作为返回值......
  • 论文阅读笔记:Mixed Pseudo Labels for Semi-Supervised Object Detection
    论文阅读笔记:MixedPseudoLabelsforSemi-SupervisedObjectDetection1背景1.1动机1.2问题2创新点3方法4模块4.1预处理策略4.2PseudoMixup4.3PseudoMosaic4.4标签重采样4.5分析5实验5.1和SOTA方法对比5.2消融实验论文:https://arxiv.org/pdf/231......
  • 网络流学习笔记
    前言zr游记系列因作者在考试的重重打击下,它,寄了。作者还是写下了这一片“网络流学习笔记”来纪念学会了网络流。废话不多说了,笔记要不是抄别人博客的,要么是抄老师课件的。基本概念关于网络流的网络流\((NetWorkFlow)\):一种类比水流的解决问题的方法。(下述概念均会用水......
  • 【笔记】传统势能线段树
    1引入传统线段树能够通过打标记实现区间修改的条件有两个:能够快速处理标记对区间询问结果的影响;能够快速实现标记的合并。有的区间修改不满足上面两个条件。但存在一些奇妙的性质,使得序列每个元素被修改的次数有一个上限。如果我们保证每暴力\(O(\logn)\)修改一次的时......