servicemanger 作为 binder 的特殊 service,如果需要与其进行通信,需要获取到 binder 的代理端。所以,注册 Native 服务调用 addService() 方法时也需要先获取 binder 代理。而这个入口就是使用 defaultServiceManager。
一、获取代理
这里我们先来看一下注册 Native 服务的代码。
sp<ProcessState> proc(ProcessState::self());
//获取BpServiceManager指针
sp<IServiceManager> sm = defaultServiceManager();sp<XXXService> mService = new XXXService();
//通过IServiceManager注册服务
sm->addService(String16(NATIVESERVICE_NAME), mService, false);ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
可以看到注册服务是通过 IServiceManager 的 addService 接口实现的。
1、IServiceManager.cpp
源码位置:/frameworks/native/libs/binder/IServiceManager.cpp
sp<IServiceManager> defaultServiceManager()
{std::call_once(gSmOnce, []() {sp<AidlServiceManager> sm = null