Chinaunix首页 | 论坛 | 博客
  • 博客访问: 53218
  • 博文数量: 11
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 105
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-12 16:43
文章分类

全部博文(11)

文章存档

2013年(1)

2010年(10)

我的朋友

分类: LINUX

2010-04-27 09:08:21

第三部分 程序中Binder的具体实现

3.1 一个利用接口的具体实现
    PermissionController也是libutils中定义的一个有关权限控制的接口,它一共包含两个文件:IPermissionController.h和IPermissionController.cpp这个结构在所有类的实现中都是类似的。
     头文件IPermissionController.h的主要内容是定义IPermissionController接口和类BnPermissionController:
class IPermissionController : public IInterface
{
public:
    DECLARE_META_INTERFACE(PermissionController);
    virtual bool   checkPermission(const String16& permission,int32_t pid, int32_t uid) = 0;
    enum {
        CHECK_PERMISSION_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION
    };
};
class BnPermissionController : public BnInterface
{
public:
    virtual status_t    onTransact( uint32_t code,
                                    const Parcel& data,
                                    Parcel* reply,
                                    uint32_t flags = 0);
};

    IPermissionController是一个接口类,只有checkPermission()一个纯虚函数。
    BnPermissionController继承了以BnPermissionController实例化模版类BnInterface。因 此,BnPermissionController,事实上BnPermissionController双继承了BBinder和 IPermissionController。
    实现文件IPermissionController.cpp中,首先实现了一个BpPermissionController。

class BpPermissionController : public BpInterface
{
public:
    BpPermissionController(const sp& impl)
        : BpInterface(impl)
    {
    }
    virtual bool checkPermission(const String16& permission, int32_t pid, int32_t uid)
    {
        Parcel data, reply;
        data.writeInterfaceToken(IPermissionController::
                                       getInterfaceDescriptor());
        data.writeString16(permission);
        data.writeInt32(pid);
        data.writeInt32(uid);
        remote()->transact(CHECK_PERMISSION_TRANSACTION, data, &reply);
        if (reply.readInt32() != 0) return 0;
        return reply.readInt32() != 0;
    }
};
IMPLEMENT_META_INTERFACE(PermissionController, "android.os.IPermissionController");

    BpPermissionController继承了BpInterface,它本身是一个 已经实现的类,而且并没有在接口中体现。这个类按照格式写就可以,在实现checkPermission()函数的过程中,使用Parcel作为传输数据 的容器,传输中时候transact()函数,其参数需要包含枚举值CHECK_PERMISSION_TRANSACTION。 IMPLEMENT_META_INTERFACE用于扶助生成。
    BnPermissionController中实现的onTransact()函数如下所示:

status_t BnPermissionController:: BnTransact(
    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
    switch(code) {
        case CHECK_PERMISSION_TRANSACTION: {
            CHECK_INTERFACE(IPermissionController, data, reply);
            String16 permission = data.readString16();
            int32_t pid = data.readInt32();
            int32_t uid = data.readInt32();
            bool res = checkPermission(permission, pid, uid);
            reply->writeInt32(0);
            reply->writeInt32(res ? 1 : 0);
            return NO_ERROR;
        } break;
        default:
            return BBinder:: BnTransact(code, data, reply, flags);
    }
}

       在onTransact()函数中根据枚举值判断数据使用的方式。注意,由于BnPermissionController也是继承了类 IPermissionController,但是纯虚函数checkPermission()依然没有实现。因此这个 BnPermissionController类并不能实例化,它其实也还是一个接口,需要一个实现类来继承它,那才是实现具体功能的类。

3.2 BnABC的实现
    本地服务启动后将形成一个守护进程,具体的本地服务是由一个实现类继承BnABC来实现的,这个服务的名称通常叫做ABC。
    在其中,通常包含了一个instantiate()函数,这个函数一般按照如下的方式实现:
void ABC::instantiate() {
    defaultServiceManager()->addService(
            String16("XXX.ABC"), new ABC ());
}

    按照这种方式,通过调用defaultServiceManager()函数,将增加一个名为"XXX.ABC"的服务。
    在这个defaultServiceManager()函数中调用了:
ProcessState::self()->getContextObject(NULL));
    IPCThreadState* ipc = IPCThreadState::self();
   IPCThreadState::talkWithDriver()

在ProcessState 类建立的过程中调用open_driver()打开程序,在talkWithDriver()的执行过程中。

3.3 BpABC调用的实现
    BpABC调用的过程主要通过mRemote()->transact() 来传输数据,mRemote()是BpRefBase的成员,它是一个IBinder。这个调用过程如下所示:
    mRemote()->transact()
    Process::self()
    IPCThreadState::self()->transact()
    writeTransactionData()
    waitForResponse()
    talkWithDriver()
    ioctl(fd, BINDER_WRITE_READ, &bwr)


    在IPCThreadState::executeCommand()函数中,实现传输操作。

阅读(1696) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~