美文网首页
Binder 的一些小 Tips

Binder 的一些小 Tips

作者: Wi1ls努力努力再努力 | 来源:发表于2018-11-15 13:48 被阅读0次

    Java 层的 IBinder 在 native 层的表现:Binder 表现为 JavaBBinder,BinderProxy 表现为 BpBinder。
    native层的服务,在远端表现为 BpXXXService(内部持有 BpBinder),服务端表现为 BnXXXService(继承于 BnBinder)


    BpBinder BnBinder BpXXXService BnXXXService:

    以 MediaPlayerService 相关的为例子;

    const sp<IMediaPlayerSerivce>& IMediaDeathNotifier::getMediaPlayerService(){
        ...
        if(sMediaPlayerService == 0){
            //得到 BpServiceManager(BpBinder(0))
            sp<IServicePlayService> sm = defaultServiceManager();
            sp<IBinder> binder;
            do{
                //得到一个 BpBinder,handle 指向 MediaPlayerService
                binder = sm->getService(String16("media.player"));
                if(binder != 0){
                    break;
                }
            }while(true)
            //在 IMediaPlayerService.cpp 实现了宏
            //IMPLEMENT_META_INTERFACE(MediaPlayerService, "android.media.IMediaPlayerService");
            //展开后得到 sMediaPlayerService 是 BpMediaPlayerService(BpBinder(handle 指向 MediaPlayerService))
            sMediaPlayerService = interface_cast<IMediaPlayerService>(binder);
        }
    }
    

    在其他进程获得的服务是 BpXXXService(BpBinder(handle)),是利用每个服务实现了不同的IMPLEMENT_META_INTERFACE(INTERFACE, name)产生的不同的interface_cast


    对于 BnXXXService,是

    //MediaPlayerService.h
    class MediaPlayerService : public BnMediaPlayerService{
    
    }
    

    与 service manager 的通信的殊途同归
    以获得 service manager 的代理来说,java 层调用getIServiceManager()@ServiceManager得到 BinderProxy(),这个 BpBinder 的 mObject 字段保存了 natvie 保存的 BpBinder(0);
    native 层调用defaultServiceManager()@IServiceManager.cpp得到BpServiceManager(BpBinder(0));
    无论是 java 层还是 native 层,与 service manager 通信的时候都是依靠这个 BpBinder(0)进行 transact。


    相关文章

      网友评论

          本文标题:Binder 的一些小 Tips

          本文链接:https://www.haomeiwen.com/subject/fdzxxqtx.html