一,Android 服务种类
如图1所示,在Android系统中的服务主要分两类,一类是系统服务,它们是由Framework提供的;另一类是应用程序服务,它们是应用程序开发者继承并实现的service类后开发出来的。
图1:Android 服务分类
从图1了解到Android系统中的各种服务,至于如何各类服务简单介绍如下:
应用服务是后台服务程序,它是继承了Android SDK(framework)的serivce类的实例,没有UI界面,定期执行某些任务。应用服务程序分为本地服务和远程服务,两者的区别在于创建服务的客户端与所创建的服务是否运行在同样进程。
系统服务提供了Android中最基本、最核心的功能,如网络管理、消息显示、图形显示管理等。这些服务分别存在于Application Framework与Libraries层之间。系统服务分本地服务和java服务,本地服务使用C++编写,运行在Libraries层,Android系统的surface Flinger服务;Java服务是指在Android启动时,JAVA 系统服务由SystemServer系统进程启动,如Connectivity service、Wifi service。
本文不对Android应用程序服务做介绍,只分析系统服务,并通过系统服务的例子来理解Android的跨进程通信。
二,Android 系统服务
系统服务与Framework中的其他模块通信时,使用Binder IPC,系统服务这类服务提供者必须把相关信息注册到Context Manager中,以便Android 应用程序这类服务使用者能够使用其提供的服务。图2描述了系统服务结构。
图2 : system Server 运行系统服务
Android 系统服务体系庞大且复杂,这里着重放在系统服务运行原理及服务调用机制上的理解,从概念上来讲,Android的系统服务运行原理十分简单,将其想象成服务使用者与系统服务间的RPC即可,即服务使用者根据服务事先定义好的接口远程调用服务器提供的方法,从而使用服务提供的功能,这是Android系统服务基本的运行原理,如图3所示。
原理虽然简单,但内部实现相当复杂,我们只需要理解如何使用服务即可,不必追究内部的复杂的RPC机制,图3描述了服务使用者(client)调用Hello使用RPC的方式调用系统服务提供的hello方法的过程,服务运行原理形象、具体,一目了然。
图3:Android 系统服务调用流程
图3 例子描述了服务使用者如何通过Binder RPC调用系统服务,服务使用者调用hello()服务代理函数,而后hello()服务代理函数通过Binder RPC 调用Hello服务的hello服务Stub 函数。图3中使用主要术语介绍如下:
服务客户端(client):指使用系统服务的进程
Service Server:指运行系统服务的进程
上下文管理器(context manager):是一个管理服务的系统进程,它管理安装在系统中的各种系统服务的位置信息,这些信息用来做Binder IPC的寻址使用
服务接口(Service Interface):它是一个预先定义好的接口,在服务使用者与系统服务间。系统服务应该根据相关接口实现Stub函数,并提供相关服务。而服务使用者也必须根据相关接口调用服务。
Binder IPC:它是Android中进程间通过Binder Driver交换数据的方式。
Binder IPC数据:一种服务与Binder Driver的数据格式。
Binder RPC:服务会向使用者提供基于特定接口的函数,服务使用者通过Binder IPC调用这些函数,就像调用自身函数一样。
Binder RPC 数据:服务使用者与服务间进行Binder IPC时的数据。
三,编写本地服务
前面已经介绍了Android 中的系统服务,在机顶盒业务中,也会遇到需要编写本地服务的场景,如TMS模块,就是一个本地服务,客户端通过Binder 通信与服务通信。本节将在之前基础之上编写一个Android本地服务HybroadService。HybroadService功能很简单,就是执行一个ping 命令,通过这个服务的实现将能更好地理解图4。
图4 Hybroad 服务类图
图4,它是HybroadService 服务结构的类图。从类图中可以看出,Hybroad 系统服务由IHybroadService 服务接口、BnHybroadService服务的Stub、HyroadService服务、BpHybroadSerivice 服务代理构成。