是通过ServiceManagerNative.asInterface()
方法来获取ServiceManager
对象,asInterface
方法的参数中是调用了BinderInternal.getContextObject()
方法。这是一个native方法。
getContextObject()
static jobject android_os_BinderInternal_getContextObject(JNIEnv* env, jobject clazz)
{
sp b = ProcessState::self()->getContextObject(NULL);
return javaObjectForIBinder(env, b);
}
由于本小节是讲解Java的,这里就不做过多的讲解了。对于ProcessState::self()->getContextObject()
这个方法,等价于new BpBinder(0)
。即BinderInternal.getContextObject()
方法最后是获取BpBinder
对象。
那么回过头来看asInterface
方法的具体实现:
ServiceManagerNative.asInterface
//frameworks/base/core/java/android/os/ServiceManagerNative.java
static public IServiceManager asInterface(IBinder obj)
{
if (obj == null) {
return null;
}
IServiceManager in =
(IServiceManager)obj.queryLocalInterface(descriptor);
if (in != null) {
return in;
}
return new ServiceManagerProxy(obj);
}
采用了单例模式获取ServiceMan![](https://www.hualigs.cn/image/61dba891ed8ee.jpg) ager
,asInterface()
返回的是ServiceManagerProxy
(简称SMP)对象。所以最后getIServiceManager()
方法等价于new ServiceManagerProxy(new BinderProxy())
既然getIServiceManager()
获取到的是ServiceManagerProxy
,那ServiceManager.getService(name)
方法就是调用的ServiceManagerProxy.getService(name)
的方法。我们先看一下ServiceManagerProxy
是怎么被初始化的:
ServiceManagerProxy初始化
//frameworks/base/core/java/android/os/ServiceManagerNative.java
class ServiceManagerProxy implements IServiceManager {
public ServiceManagerProxy(IBinder remote) {
mRemote = remote;
}
}
mRemote
为BinderProxy
对象,该BinderProxy
对象对应于BpBinder(0)
,其作为binder代理端,指向native层大管家service Manager
。还记得BpBinder对象吗?在上一节&#x