1.Android系统服务
Android系统服务提供系统最基本、最核心的功能,如设备控制、位置信息、通知设定、消息显示等。这些服务分别存在于Application Framework与Libraries层之中。如下图所示:
2.系统服务分类
系统服务分为本地系统服务和Java系统服务。
2.1 本地系统服务
本地系统服务使用C/C++编写,运行在Libraries层,主要包含Audio Flinger,Surface Flinger等。
其中Audio Flinger服务混合多种Android应用程序的音频数据,并发送到耳机、扬声器等音频输出设备中,所有音频数据均经由Audio Flinger进行输出。
Surface Flinger是Android Multimedia的一部分,在Android的实现中,它用于提供系统范围内的surface composer功能,能够将各种应用程序的Surface组合后渲染到Frame Buffer设备中。
2.2 Java系统服务
在Android启动时,Java系统服务由SystemServer系统进程启动,具体是如何启动的,可以查看博客Zygote完全解析(2)。Java系统服务分为核心平台服务与硬件服务。
2.2.1 核心平台服务(Core Platform Service)
一般来说,核心平台服务不会直接与Android应用程序进行交互,但它们是Android Framework运行所必需的服务,其包含的主要服务为:
- Activity Manager Service:管理所有Activity的生命周期与堆栈
- Window Manager Service:位于Surface Flinger之上,将要绘制到机器画面上的内容传递给Surface Flinger
- Package Manager Service:加载apk文件的信息,提供信息显示系统中设置了哪些包,以及加载了哪些包
2.2.2 硬件服务(Hardware Service)
该服务提供了一系列API,用于控制底层硬件,主要包含如下服务:
- Alarm Manager Service:在特定时间后运行指定的应用程序,就像定时器;
- Connectivity Service:提供有关网络当前状态的信息
- Location Service:提供终端当前的位置信息
- Power Service:设备电源管理
- Sensor Service:提供Android中各种传感器(磁力传感器、加速度传感器)的感应值
- Telephony Service:提供话机状态及电话服务
- Wifi Service:控制无线网络连接,如AP搜索、连接列表管理等
2.2.3 如何使用Java系统服务
无论是在Framework内部,还是Android应用程序中,若想使用Java系统服务,必须使用能够与各服务通信的Local Manager对象。
比如,应用程序若想使用Location Service,获取终端设备当前的位置信息,需要先调用getSystemService()函数,创建与Location Service相应的Local Manager对象,而后应用程序使用生成的Local Manager对象,调用Location Service提供的各种函数,执行相应的功能。
2.3 运行系统服务
我们知道,在应用程序中,我们在使用一个服务前,需要先调用startService()函数以启动相应的服务。与之不同的是,使用系统服务时,客户端不需要先启动它,直接调用getSystemService()使用即可。因为在Android系统的启动过程中,init进程已经启动了这些系统服务。
在Android启动时,系统服务具体由媒体服务器(Media Server)与系统服务器(System Server)两个系统进程运行。Media Server用来启动除Surface Flinger之外的Audio Flinger、MediaPlayer Service等本地服务。而System Server是Zygote最初生成的基于Java的进程,它会启动所有Java系统服务和一个本地系统服务:Surface Flinger.
由于在博客Zygote完全解析(2)中已经详细介绍过System Server加载Java系统服务和Surface Flinger的过程,所以此处不再赘述。
至此,我们可以用下面这张图来归纳Android启动时生成系统服务的过程:
2.3.1 Media Server的运行过程
Media Server是个系统进程,它运行Audio Flinger、Media Player Service、Camera Service、Audio Policy Service等本地系统服务。它由init进程启动运行,在init.rc脚本文件中,可以看到相关脚本,如下所示:
下面是frameworks/base/media/mediaserver/main_mediaserver.cpp中的main()函数代码:
|
|
要完成理解代码需要等我们学习完Binder机制之后,简单地说就是初始化并注册了AudioFlinger,MediaPlayerService,CameraService等。比如AudioFlinger::instantiate()的代码如下:
|
|
其中defaultServiceManager()返回的是BpServiceManager对象,addService()即为注册函数。详细的分析将在后面Binder机制的分析中给出。