从Java层理解Android Binder(二):Service Manager

上一节我们学习了AIDL中涉及到的Binder相关的类,如下图:

从Java层理解Android Binder(二):Service Manager_第1张图片

接下来讲解Service Manager。

Service Manager是一个笼统的概念,整体来说它是Binder Driver之上的"DNS"功能,用于Client方便的获得其他服务,比如Activity Manager Service。ServiceManager和AcitivtyManagerService从层次上讲是平级的,都是Binder Server,只不过ServiceManager统一维护了很多Binder Server,如果不通过Service Manager,也是可以访问到Activity Manager Service的。

Service Manager也包括C++实现和Java封装。C++层的特点是最早初始化,循环读取消息。我们这里不做过多介绍,而是主要分析Java层的类结构。

Service Manager的目的是提供其他service的入口,因此它提供了getService等方法。与上文提到的AIDL结构对比来看,他们是这样的:

从Java层理解Android Binder(二):Service Manager_第2张图片

定义了一个IServiceManager接口,与我们前文提到的业务接口同级,继承自IInterface。

前文提到AIDL自动生成了一个Stub类,它实现了业务接口,同时继承自Binder。我们再看看ServiceManager这边:

从Java层理解Android Binder(二):Service Manager_第3张图片

看到没,ServiceManagerNative和Stub基本一毛一样,都是抽象类,同样的类结构,同样的方法。都是调用C++实现跨进程通信。

那么Proxy呢?相信你一定也猜到了:

从Java层理解Android Binder(二):Service Manager_第4张图片

AIDL中Proxy是Stub的内部类,而ServiceManager中Proxy也是Native的内部类,完全一致!

那么AIDL中具体的业务实现类MyServer,在ServiceManager中对应的是哪个类呢?ServiceManagerNative是个抽象的,必然有一个子类啊?很遗憾我这里没找到。

最后有一个就叫ServiceManager.java的类,它就是一个工厂类,提供了静态的getService方法,没啥特别的。

最后整体类图如下:

从Java层理解Android Binder(二):Service Manager_第5张图片


你可能感兴趣的:(Android)