Binder 通讯中,在 native 层从 service_manager 注册或者得到某个服务,都要先获得 service_manager 在本进程的 proxy,defaultServiceManager()@IServiceManager.cpp 正是来获得这个代理对象的。
IServiceManager.cpp:(.../frameworks/native/libs/binder/IServiceManager.cpp)
sp<IServiceManager> defaultServiceManager()
{
if (gDefaultServiceManager != NULL) return gDefaultServiceManager;
{
AutoMutex _l(gDefaultServiceManagerLock);
if (gDefaultServiceManager == NULL) {
gDefaultServiceManager = interface_cast<IServiceManager>(
ProcessState::self()->getContextObject(NULL));
}
}
return gDefaultServiceManager;
}
使用了单例,只有一个 gDefaultServiceManager
获取这个 gDefaultServiceManager 的关键就在
interface_cast<IServiceManager>(ProcessState::self()->getContextObject(NULL));
首先看 ProcessState::self()->getContextObject(NULL);ProcessState 是进程单例(从其ProcessState::self()可以看出),保存了当前进程的上下文信息
ProcessState:(.../frameworks/native/libs/binder/ProcessState.cpp)
sp<ProcessState> ProcessState::self()
{
Mutex::Autolock _l(gProcessMutex);
if (gProcess != NULL) {
return gProcess;
}
gProcess = new ProcessState;
return gProcess;
}
sp<IBinder> ProcessState::getContextObject(const sp<IBinder>& )
{
return getStrongProxyForHandle(0);
}
//这个 handle 表示的是在某个资源项数组的索引(何种资源项暂时不知)
sp<IBinder> ProcessState::getStrongProxyForHandle(int32_t handle)
{
sp<IBinder> result;
AutoMutex _l(mlock);
//根据索引查找资源,如果lookupHandleLocked 未找到对应资源,则创建并返回
handle_entry* e = lookupHandleLocked(handle);
if (e!=NULL){
//一般都会走这个分支
IBinder* b = e->binder;
if( b == NULL || !e->refs->attemptIncWeck(this)){
if ( handle ==0 ){
//本例中的 handle 就为0,以下操作与 service_manager 进行一个 PING 通信,以确保 service_manager 已经初始化成功并且还存活
Parcel data;
status_t status = IPCThreadState::self()->transact(0, IBinder::PING_TRANSACTION, data, NULL, 0);
if(states == DEAD_OBJECT){
return NULL;
}
}
//生成一个 BpBinder 对象,并且其内部持有这个 handle
b = new BpBinder(handle);
e->binder = b;
if(b) e->refs = b->getWeakRefs();
result =b;
}else{
...
}
}
return result;
}
于是可以认为
ProcessState::self()->getContextObject(NULL) 等价于
new BpBinder(0)
于是
gDefaultServiceManager = interface_cast<IServiceManager>(new BpBinder(0));
接下来分析interface_cast<IServiceManager>()这个函数,这个函数是模板函数,定义在IInterface.h 中:(.../frameworks/native/include/binder/IInterface.h)
template<typename INTERFACE>
inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj)
{
return INTERFACE::asInterface(obj);
}
而这个asInterface()是由两个大名鼎鼎的宏创建出来的函数
#define DECLARE_META_INTERFACE(INTERFACE)
static const android::String16 descriptor;
static android::sp<I##INTERFACE> asInterface(const android::sp<android::IBinder>& obj);
virtual const android::String16& getInterfaceDescriptor() const;
I##INTERFACE();
virtual ~I##INTERFACE();
#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(){ }
关于ServiceManager 对于这个宏的展开是在BpServiceManager(同位于 IServiceManager.cpp) 类中
class BpServiceManager :: public BpInterface<IServiceManager>
{
public:
BpServiceManager(const sp<IBinder>& impl)
: BpInterface<IServiceManager>(impl)
{
}
...
//在这里进行宏展开,而宏声明则是在其父类 BpInterface 中,BpInterface 是一个模板类,位于 IInterface.h 中
IMPLEMENT_META_INTERFACE(ServiceManager, "android.os.IServiceManager");
}
进行宏展开得到
const android::String16 IServiceManager::descriptor("android.os.IServiceManager");
const android::String16& IServiceManager::getInterfaceDescriptor() const{
return IServiceManager::descriptor;
}
android::sp<IServiceManager> IServiceManager::asInterface(const android::sp<android::IBinder>& obj){
android::sp<IServiceManager> intr;
if(obj != NULL){
intr = static_cast<IServiceManager*>(obj->queryLocalInterface(IServiceManager::descriptor).get());
if(intr == NULL){
intr = new BpServiceManager(obj);
}
}
return intr;
}
IServiceManager::IServiceManager(){ }
IServiceManager::~IServiceManager(){ }
花了这么多时间,说明了以下:
interface_cast<IServiceManager>(new BpBinder(0))
等价于
IServiceManager::asInterface(new BpBinder(0));
等价于
new BpServiceManager(new BpBinder(0));
IServiceManager 继承自 IInterface(类的申明在(.../frameworks/native/include/binder/IServiceManager.h)中)
主要的难点在于这两个关键的宏展开
另外 继承关系在
//.../frameworks/native/libs/binder/IServiceManager.cpp
class BpServiceManager :: public BpInterface<IServiceManager>
//.../frameworks/native/include/binder/IInterface.h
template<typename INTERFACE>
inline BpInterface<INTERFACE>::BpInterface(const sp<IBinder>& remote)
: BpRefBase(remote)
{
}
//构造函数
BpRefBase::BpRefBase(const sp<IBinder>& o)
: mRemote(o.get()),mRefs(NULL),mState(0)
{
...
}
gDefaultServiceManager() = new BpServiceManager(new BpBinder(0));
其中这个 IServiceManager中的remote 就是这个BpBinder(0)对象,并且这个 BpBinder 是进行Binder 通讯的主体
综上,分析完毕