匿名binder就是没有向servicemanager提交注册的binder。
对于已经建立好Binder通信的Client和server,server可以将一个Binder的引用传递给client,client可以通过这个引用来访问server。
那么这种匿名的访问是怎么建立起来的?在server被唤醒后为什么可以通过target-ptr找到bbinder呢?
答案就在第一次返回这个Binder的引用的时候,binder驱动保存了这个Binder实体的各种数据,创建了节点。
以surfaceflinger调用createConnection返回IsurfaceComposerClient为例:
status_t BnSurfaceComposer::onTransact(
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
switch(code) {
case CREATE_CONNECTION: {
CHECK_INTERFACE(ISurfaceComposer, data, reply);
sp<IBinder> b = createConnection()->asBinder();
reply->writeStrongBinder(b);//关键
//...
}
实际就是往reply中存入了一个BBinder实体。
我们进一步看下,parcel.cpp:
status_t Parcel::writeStrongBinder(const sp<IBinder>& val)