native层Binder进程间通信机制学习

IBinder派生了一个重量级的类:BBinder,代表服务端;在Binder.h中还定义了一个类BpRefBase,来代表客户端,这个类有个属性mRemote是一个IBinder对象。

下面以SurfaceFlinger为例:

SurfaceFlinger运行在system_server进程中:

SystemServer.java    

 native public static void init1(String[] args);

public static void main(String[] args) {

     ........

     init1(args);

}

android_server_SystemServer.cpp

extern "C" int system_init();

static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)
{
    system_init();
}

System_init.cpp

extern "C" status_t system_init()
{

   .......

   char propBuf[PROPERTY_VALUE_MAX];
    property_get("system_init.startsurfaceflinger", propBuf, "1");
    if (strcmp(propBuf, "1") == 0) {
        // Start the SurfaceFlinger
        SurfaceFlinger::instantiate();
    }

    ......

}

SurfaceFlinger.cpp

void SurfaceFlinger::instantiate() {
    defaultServiceManager()->addService(
            String16("SurfaceFlinger"), new SurfaceFlinger());
}

以下说明相关类之间的继承关系,见谅,不会画UML图:

SurfaceFlinger.h、 ISurfaceComposer.h 、ISurfaceComposer.cpp

class SurfaceFlinger : public BnSurfaceComposer, protected Thread

class ISurfaceComposer : public IInterface

class BnSurfaceComposer : public ISurfaceComposer, public BBinder

class BpSurfaceComposer : public ISurfaceComposer, public BpRefbase

BpSurfaceComposer持有一个mRemote对象,继承自BpRefBase,这个mRemote实际就是BBinder(SurfaceFlinger)对象。

客户端使用SurfaceFlinger的方法,以SurfaceComposerClient.cpp为例:       

static sp<ISurfaceComposer> getComposerService()
{
    sp<ISurfaceComposer> sc;
    Mutex::Autolock _l(gLock);
    if (gSurfaceManager != 0) {
        sc = gSurfaceManager;
    } else {
        // release the lock while we're waiting...
        gLock.unlock();

        sp<IBinder> binder;
        sp<IServiceManager> sm = defaultServiceManager();
        do {
            binder = sm->getService(String16("SurfaceFlinger"));
            if (binder == 0) {
                LOGW("SurfaceFlinger not published, waiting...");
                usleep(500000); // 0.5 s
            }
        } while(binder == 0);

        // grab the lock again for updating gSurfaceManager
        gLock.lock();
        if (gSurfaceManager == 0) {
            sc = interface_cast<ISurfaceComposer>(binder);
            gSurfaceManager = sc;
        } else {
            sc = gSurfaceManager;
        }
    }
    return sc;
}

其中binder = sm->getService(String16("SurfaceFlinger"));

IServiceManager.cpp

virtual sp<IBinder> getService(const String16& name) const
    {
        unsigned n;
        for (n = 0; n < 5; n++){
            sp<IBinder> svc = checkService(name);
            if (svc != NULL) return svc;
            LOGI("Waiting for sevice %s...\n", String8(name).string());
            sleep(1);
        }
        return NULL;
    }
    
    virtual sp<IBinder> checkService( const String16& name) const
    {
        Parcel data, reply;
        data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor());
        data.writeString16(name);
        remote()->transact(CHECK_SERVICE_TRANSACTION, data, &reply);
        return reply.readStrongBinder();
    }

server端在onTransact()中回复:

sp<IBinder> b = const_cast<BnServiceManager*>(this)->checkService(which);

ServiceManager.cpp

sp<IBinder> BServiceManager::checkService(const String16& name) const
{
    AutoMutex _l(mLock);
    ssize_t i = mServices.indexOfKey(name);
    LOGV("ServiceManager: getService(%s) -> %d\n", String8(name).string(), i);

    //通过SurfaceFlinger::instantiate()的addService(String16("SurfaceFlinger"), new SurfaceFlinger())可知,

   //返回的是SurfaceFlinger对象,也就是BBinder对象。
    if (i >= 0) return mServices.valueAt(i);
    return NULL;
}

再说回sc = interface_cast<ISurfaceComposer>(binder);,interface_cast展开后是:

return ISurfaceComposer::asInterface(obj);

 sp<ISurfaceComposer> ISurfaceComposer::asInterface(const sp<IBinder>& obj)  \
    {                                                                   \
        sp<ISurfaceComposer> intr;                                          \
        if (obj != NULL) {                                              \
            intr = static_cast<ISurfaceComposer*>(                          \
                obj->queryLocalInterface(                               \
                        ISurfaceComposer::descriptor).get());               \
            if (intr == NULL) {                                         \

                //这句话把传进来的BBinder对象赋值给了BpSurfaceComposer所继承的mRemote
                intr = new BpSurfaceComposer(obj);                          \
            }                                                           \
        }                                                               \
        return intr;                                                    \
    }

所以说这个sp<ISurfaceComposer> sc实际就是BpSurfaceComposer对象。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值