Android 中Bn和Bp介绍

Android  小知识  源码分析  2023年7月17日 pm6:58发布1年前 (2023)更新 城堡大人
92 0 0

前言

阅读Android源码时总是遇到Bnxx和Bpxx等类,老是对不上号,容易迷糊,因此这里记录一下,方便自己查阅。

正文

BP(binder proxy)和BN(binder native)是通过binder来通信的,Bp端可以通过BinderProxy的transact()方法与Bn端发送请求,而Bn端通过继承Binder类并重写onTransact()接收并处理来自Bp端的请求。

两端会实现相同的接口,但Proxy端只是通过binder ipc发送一个binder transaction,native端是真正做事情,再将结果返回。

Android 中Bn和Bp介绍

Bn

n 就是native,给server用。

继承是为了实现一个接口,就是一个BnXX对应一个IXX。

I 就是interface(接口)

Bp

p 就是proxy代理,给client用的。

这个存在的意义在于通过IPC机制去实现执行接口函数调用,同样一个BpXX对应一个IXX。

例子

涉及的代码块

\frameworks\av\media\libmedia\IMediaPlayer.cpp
\frameworks\av\media\libmedia\include\media\IMediaPlayer.h

这里只要介绍BnMediaPlayerBpMediaPlayer

BnMediaPlayer
class BnMediaPlayer: public BnInterface<IMediaPlayer>
{
public:
    virtual status_t    onTransact( uint32_t code,
                                    const Parcel& data,
                                    Parcel* reply,
                                    uint32_t flags = 0);
};
BpMediaPlayer
class BpMediaPlayer: public BpInterface<IMediaPlayer>
{ 
    //略
}

在代码中,客户端通过BpMediaPlayer发送消息,然后BnMediaPlayer接收,然后调用服务端进行处理。

setDataSource

以setDataSource()为例。

# BpMediaPlayer中的方法
status_t setDataSource(int fd, int64_t offset, int64_t length) {
    //略
    //通过binder,remote()就是一个binder
    remote()->transact(SET_DATA_SOURCE_FD, data, &reply);
    return reply.readInt32();
}

目前对binder不是很理解,但通过网上文章和自己跟踪,remote()->transact(SET_DATA_SOURCE_FD, data, &reply)通过Binder,最后进入了BnMediaPlayer的onTransact()方法。

status_t BnMediaPlayer::onTransact(
    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags){
    switch (code) {
        //略
        case SET_DATA_SOURCE_FD: {
            CHECK_INTERFACE(IMediaPlayer, data, reply);
             //略
            // MediaPlayerService中的Client继承BnMediaPlayer
            //这里的setDataSource是MediaPlayerService::Client::setDataSource。
            reply->writeInt32(setDataSource(fd, offset, length));
            return NO_ERROR;
        }
        //略
    }
}

当然,真正处理的还是MediaPlayerService::Client::setDataSource()方法。

从上面可以看出

  1. B就是Binder

  2. Bnxx给Server用的

  3. Bpxx是个Client用的

  4. Bpxx可以通过BinderProxy的transact()方法与Bnxxx发送请求,而Bnxx通过继承Binder类并重写onTransact()接收并处理来自Bpxx的请求。

参考文章

  1. android MediaPlayer架构

  2. Binder系列5—注册服务(addService)

  3. android 之Bn、Bp详解

  4. Bn和Bp

 历史上的今天

  1. 2024: git log命令参数部分记录(0条评论)
  2. 2021: Dialog的简单使用(0条评论)
  3. 2021: 穆旦:冥想(0条评论)
  4. 2020: [摘]SeekBar的thumbOffset属性(0条评论)
  5. 2019: 余光中:乡愁(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

Settings源码分析之蓝牙(1)

源码:Android 6.0应用:Settings目录:Settings\src\com\android\settings\bluetooth 上一回我们简单分析了Settings加载和启动过程(《Android 6.0 Settings源码简单分析》),现在我们来看看S...

鲁迅 :秋夜

在我的后园,可以看见墙外有两株树,一株是枣树,还有一株也是枣树。这上面的夜的天空,奇怪而高,我生平没有见过这样奇怪而高的天空。他仿佛要离开人间而去,使人们仰面不再看见。然而现在却非常之蓝,闪闪地〖目夹〗着几十个星星的眼,冷眼。他的口角上现出微笑,似乎自以为大有深意,而将繁霜洒在我的园里的野花上。...

Android反编译之vdex转dex查看源码

前言最近获取到客户Apk(客户版本Android 9)后使用工具没法看到源代码,system/priv-app/Media目录结构如下:C:.└─oat └─arm64 ├─Media.odex └─Media.vdex└─Media.apk...

米沃什:去森林的远足

树木那么巨大,你看不见树梢。 落下的太阳收拢玫瑰色的光芒 在每棵树上,就像在烛台上面, 小小的人儿走在下面的路上。 让我们扬起头,拉着手 这样就不会在纠结的草丛迷路。 夜晚开始在花朵上加上封条, 色彩连着色彩飘下天空。 那里,上面,一次盛宴。金罐, 倒进了阿斯彭铜器的红酒。 一辆空中的车...

ViewPager的简单使用

前言ViewPager是Android中比较常见的控件,用处很大,比如广告循环播放,图片播放等都会考虑用这个。一直在用,但没有单独写一下,因此今天抽空记录一下,方便自己查阅。正文ViewPager还有一个升级版本ViewPager2,用法也差不多,但这里只介绍ViewPager的使用。个...

卢梭:生活在大自然的怀抱里

为了到花园里看日出,我比太阳起得更早;如果这是一个晴天,我最殷切的期望是不要有信件或来访扰乱这一天的清宁。我用上午的时间做各种杂事。每件事都是我乐意完成的,因为这都不是非立即处理不可的急事,然后我匆忙用膳,为的是躲避那些不受欢迎的来访者,并且使自己有一个充裕的下午。即使最炎热的日子,在中午一时前我就...