android binder proxy

本文深入解析Android客户端如何获取并使用Binder Proxy与服务端进行通信。首先,通过defaultServiceManager()获取服务,然后通过BpBinder创建BpBinder对象。在同一个进程中,直接使用BpBinder对象;不同进程则通过getStrongProxyForHandle()创建BpBinder实例。接着,通过interface_cast转换为具体服务接口,如BpCameraService,并调用其接口方法,实际调用到BpBinder的transact(),进一步与Binder Driver交互完成跨进程通信。
摘要由CSDN通过智能技术生成

前面讲了里面binder的接口,怎么将service注册到系统,以及service的接口是怎么调用的,接下来要分析client端怎么拿到binder proxy和调用到service端去。

1、和cameraservice进程进行binder通信,首先要拿到它的proxy对象,代码如下

 sp<IServiceManager> sm = defaultServiceManager(); //servicemanger 的proxy
   sp<IBinder> binder;
     do {
        binder = sm->getService(String16(kCameraServiceName)); //通过service name从servicemanager拿到service 的proxy
        if (binder != 0) {
           break;
         }
         ALOGW("CameraService not published, waiting...");
         usleep(kCameraServicePollDelay);
    } while(true);
    gCameraService = interface_cast<::android::hardware::ICameraService>(binder);

1)defaultServiceManager()

sp<IServiceManager> defaultServiceManager()
{
    if (gDefaultServiceManager != NULL) return gDefaultServiceManager;

    {
        AutoMutex _l(gDefaultServiceManagerLock);
        while (gDefaultServiceManager == NULL) {
            gDefaultServiceManager = interface_cast<IServiceManager>(
                ProcessState::self()->getContextObject(NULL));
            if (gDefaultServiceManager == NULL)
                sleep(1);
        }
    }

    return gDefaultServiceManager;
}

2)ProcessState 和 IPCThreadState前面已经介绍过了

sp<IBinder> ProcessState::getContextObject(const sp<IBinder>& /*caller*/)
{
    return getStrongProxyForHandle(0);
}

sp<IBinder> ProcessState::getStrongProxyForHandle(int32_t handle)
{
    sp<IBinder> result;

    AutoMutex _l(mLock);

    handle_entry* e = lookupHandleLocked(handle);

    if (e != NULL) {
        IBinder* b = e->binder;
        if (b == NULL || !e->refs->attemptIncWeak(this)) {
            if (handle == 0) {
                // Special case for context manager...
                // The context manager is the only object for which we create
                // a BpBinder proxy without already holding a reference.
                // Perform a dummy transaction to ensure the context manager
                // is registered before we create the first local reference
                // to it (which will occur when creating the BpBinder).
                // If a local reference is created for the BpBinder when the
                // context manager is not present, the driver will fail to
               
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值