本文参考《Android系统源代码情景分析》,作者罗升阳。
一、Binder库(libbinder)代码:
~/Android/frameworks/base/libs/binder
----BpBinder.cpp
----Parcel.cpp
----ProcessState.cpp
----Binder.cpp
----IInterface.cpp
----IPCThreadState.cpp
----IServiceManager.cpp
----Static.cpp
~/Android/frameworks/base/include/binder
----Binder.h
----BpBinder.h
----IInterface.h
----IPCThreadState.h
----IServiceManager.h
----IBinder.h
----Parcel.h
----ProcessState.h
驱动层代码:
~/Android//kernel/goldfish/drivers/staging/android
----binder.c
----binder.h
二、总体概述
如果Binder本地对象意外死亡,会导致依赖于它的Binder代理对象变得无效。
我们将分析Binder对象死亡通知机制,它可以监控到Binder本地对象的死亡事件,然后通知那些引用了它的Binder代理对象,从而在一定程度上解决无效Binder代理对象的问题。
在这种死亡机制中,首先是Binder代理对象将一个死亡接收通知注册到Binder驱动程序中,然后当Binder驱动程序监控到它所引用的Binder本地对象死亡时,Binder驱动程序就会向它发送一个死亡通知。
另外,当一个Binder代理对象不需要接收它所引用的Binder本地对象的死亡通知时,它也可以注销之前所注册的死亡接受通知。
三、注册死亡通知
Binder代理对象在注册它所引用的Binder本地对象的死亡接受通知之前,首先要定义好死亡通知接受者。Binder库定义了死亡通知接受者必须要继承的基类DeathRecipient,它的实现如下所示:
~/Android/frameworks/base/include/binder
----IBinder.h
class IBinder : public virtual RefBase
{
public:
class DeathRecipient : public virtual RefBase
{
public:
virtual void binderDied(const wp<IBinder>& who) = 0;//重写父类DeathRecipient的成员函数binderDied
};
......
};
自定义的死亡通知接受者必须要重写父类DeathRecipient的成员函数binderDied。当Binder驱动程序通知一个Binder代理对象它所引用的Binder本地对象已经死亡时,就会调用它所指定的死亡通知接受者的成员函数binderDied。
定义好死亡通知接受者之后,我们就可以调用Binder代理对象的成员函数linkToDeath来注册一个死亡接受通知了。实现如下:
~/Android/frameworks/base/libs/binder
----BpBinder.cpp
status_t BpBinder::linkToDeath(
const sp<DeathRecipient>& recipient, void* cookie, uint32_t flags)
{
Obituary ob;
ob.recipient = recipient;
ob.cookie = cookie;//用来标识死亡接受者
ob.flags = flags;//用来标识死亡接受者
......
{
AutoMutex _l(mLock);
if (!mObitsSent) {//mObitsSent用来表示Binder驱动程序是否已经向它发送过死亡通知,如果是,直接返回DEAD_OBJECT