android的binder机制

status_t IPCThreadState::talkWithDriver(bool doReceive) 这个函数会把kernel driver打交道,通过ioctl。

status_t status = IPCThreadState::self()->transact( 这个是在BpBinder 里的 status_t BpBinder::transact( 调用的。

#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME)                       \
    const android::String16 I##INTERFACE::descriptor(NAME);             \
    const android::String16&                                            \
            I##INTERFACE::getInterfaceDescriptor() const {              \
        return I##INTERFACE::descriptor;                                \
    }                                                                   \
    android::sp<I##INTERFACE> I##INTERFACE::asInterface(                \
            const android::sp<android::IBinder>& obj)                   \
    {                                                                   \
        android::sp<I##INTERFACE> intr;                                 \
        if (obj != NULL) {                                              \
            intr = static_cast<I##INTERFACE*>(                          \
                obj->queryLocalInterface(                               \
                        I##INTERFACE::descriptor).get());               \
            if (intr == NULL) {                                         \
                intr = new Bp##INTERFACE(obj);                          \
            }                                                           \
        }                                                               \
        return intr;                                                    \
    }                                                                   \
    I##INTERFACE::I##INTERFACE() { }                                    \
    I##INTERFACE::~I##INTERFACE() { }                                   \

所有的BpXXX都是在这个 I##INTERFACE::asInterface 里创建的。

常见的用法是:

IBinder service = ServiceManager.getService("mount");
mMountService = IMountService.Stub.asInterface(service);

与BpBinder类对应的是BBinder类,它们都是IBinder的子类,都需要定义 transact函数,不同是前者(proxy)的transact只是一个ipc调用,后者则是真 正干活的。

前者什么时候会被调用?随便一搜出来的基本上都是 remote()->transact(...) ,但后者的调用比较隐蔽一些,初步怀疑是在 void IPCThreadState::joinThreadPool(bool isMain) 里,调了 result = talkWithDriver(); ,然后是 result = executeCommand(cmd); ,此函数会 调用 const status_t error = b->transact(tr.code, buffer, &reply, tr.flags);