Binder 的一些小 Tips

2018-11-15  本文已影响0人  Wi1ls努力努力再努力

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。


上一篇下一篇

猜你喜欢

热点阅读