Android系统服务概要
本篇基于android2.2.3
Android系统服务提供系统最基本、最核心的功能,如设备控制、位置信息、通知设定、以及消息显示等。这些服务分别存于Application Framework与Libraries层之中
系统服务分类
本地系统服务
本地系统服务使用C++编写,运行在Libraries层,主要包含Audio Flinger、Surface Flinger等
Audio Flinger服务
Audio Flinger服务混合多种Android应用程序的音频数据,并发送到耳机、扬声器等音频输出设备中。在Android设备中,所有音频数据均经由Audio Flinger进行输出
Surface Flinger服务
Surface Flinger是Android Multimedia的一部分,在Android的实现中,它是一个服务,提供系统范围内的surface composer功能,能够将各种应用程序的Surface组合后渲染到Frame Buffer设备中
Java系统服务
核心平台服务
一般而已,核心平台服务(Core Platform Service)不会直接与Android应用程序进行交互但它们是Android Framework运行所必须的服务,其中主要服务如下:
Activity Manager Service
管理所有Activity的生命周期与堆栈(Stack)Window Manager Service
位于Surface Flinger之上,将要绘制到机器画面上的内容传递给Surface FlingerPackage Manager Service
加载apk文件(Android包文件)的信息,提供信息显示系统中设置了哪些包,以及加载了哪些包
硬件服务
硬件服务(Hardware Service)提供了一系列API,用于控制底层硬件,主要包括如下服务
Alarm Manager Service
在特定时间后运行指定的应用程序,就像定时器Connectivity Service
提供有关网络当前状态的信息Location Service
提供终端当前的位置信息Power Service
设备电源管理Sensor Service
提供Android中各种传感器的感应值Telephony Service
提供话机状态及电话服务Wifi Service
控制无线网络连接
使用Java系统服务
无论在Framework内部,还是Android应用程序中,若想使用Java系统服务,必须使用能够与各服务通信的Local Manager对象
应用程序若想使用Location Service,获取终端设备当前的位置信息,需要先调用getSystemService()函数,创建与Location Service相应的Local Manager对象,而后应用程序使用生成的Local Manager对象,调用Location Service提供的各种函数,执行相应的功能。
运行系统服务
在使用应用程序服务前,Android应用程序会先调用startService()函数,启动指定的应用程序服务,而后再使用它。与之不同的是,使用系统服务时,客户端不需要启动它,直接调用getSystemService()使用即可。因为Android系统的启动过程中,init进程已经启动了这些系统服务。
在Android启动时,系统服务具体由媒体服务器(Media Service)与系统服务器(System Service)两个系统进程运行。媒体服务器进程用来启动除Surface Flinger之外的Audio Flinger、Media Player Service等本地服务。而系统服务器是Zygote最初生成的基于Java进程,它会启动所有Java系统服务,例如本地系统服务Surface Flinger
媒体服务器的运行代码
媒体服务器是个系统进程,它运行Audio Flinger、Media Player Service、Camera Service、Audio Policy Service等本地系统服务,由init进程启动运行
service media /system/bin/mediaserver
user media
group system audio camera graphics inet net_bt net_bt_admin net_raw
生成并初始化本地服务
int main(int argc, char** argv)
{
...
AudioFlinger::instantiate();
MediaPlayerService::instantiate();
CameraService::instantiate();
AudioPolicyService::instantiate();
...
}
分析各系统服务的初始化代码
系统服务与Framework中的其他模块通信时,使用Binder IPC,系统服务这类服务提供者必须把相关信息注册到Context Manager中,以便Android应用程序这类服务使用者能够使用其提供的服务
各本地服务的初始化代码形式都相似,即首先使用new运算符生成服务的实例,而后调用addService()函数将各个服务注册到Context Manager中
void AudioFlinger::instantiate() {
defaultServiceManager()->addService(
String16("media.audio_flinger"), new AudioFlinger());
}
MediaPlayerService::instantiate
void MediaPlayerService::instantiate() {
defaultServiceManager()->addService(
String16("media.player"), new MediaPlayerService());
}
void CameraService::instantiate() {
defaultServiceManager()->addService(
String16("media.camera"), new CameraService());
}
AudioPolicyService::instantiate
void AudioPolicyService::instantiate() {
defaultServiceManager()->addService(
String16("media.audio_policy"), new AudioPolicyService());
}
defaultServiceManager()函数会返回Service Manager对象,它是一个代理对象,用来实现Context Manager与Binder之间的通信。在Framework中,若想使用Context Manager的注册或获取服务等功能,必须使用Service Manager
系统服务器的运行代码
系统服务器(System Service)是一个Java进程,由Zygote进程生成。
System Service由Zygote进程最初生成,运行在Dalvik虚拟机中的Java进程,它用来运行多种Java系统服务,还有Surface Flinger本地系统服务。
由脚本可知,在Zygote运行行带有“-start-system-server”选项时,该选项请求在Zygote中生成System Server.
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
socket zygote stream 666
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
加载android_servers库
SystemServer main()方法的主要功能是加载android_servers库(libandroid_server.so),并调用init()方法。init1()通过JNI调用system_init()本地函数。system_init()函数的主要功能是生成并初始化本地系统服务Surface Flinger
Surface Flinger是基于C++的系统服务,而System Server是Java进程,它不能直接调用Surface Flinger服务。System Server必须经由JNI通过调用system_init()函数来运行Surface Flinger服务。Surface Flinger是本地系统服务,它采用类似Audio Flinger的代码来进行初始化
Surface Flinger运行后,执行runtime->callStaic("com/android/server/SystemServer","init2")
语句,调用SystemServer类的init2()方法。callStaic()函数是JNI包装函数,它运行在C++代码中经由JNI调用Java类的静态方法
Java系统服务的初始化及注册
在SystemServer的执行中,先初始化Surface Flinger,而后调用init2()方法,该方法能够生成并初始化从Entropy服务到AppWidge服务的所有Java系统服务
init2()方法会首先创建ServerThread对象,而后启动它。ServerThread是一个Java线程,它可以运行Android的所有Java系统服务
public static final void init2()
{
Slog.i(TAG, "Entered the Android system server!");
Thread thr = new ServerThread();
thr.setName("android.server.ServerThread");
thr.start();
}
同本地系统服务一样,Java系统服务必须先把相关服务注册到Context Manager中,其他模块才能使用这些服务。但是Java系统服务的注册方式与基于C++的本地系统服务不同,它通过调用ServiceManager类的addService()静态方法,将自身注册到Context Manager中
class ServerThread extends Thread
{
...
@Override
public void run()
{
...
try {
Slog.i(TAG, "Entropy Service");
ServiceManager.addService("entropy", new EntropyService());
Slog.i(TAG, "Power Manager");
power = new PowerManagerService();
ServiceManager.addService(Context.POWER_SERVICE, power);
Slog.i(TAG, "Activity Manager");
context = ActivityManagerService.main(factoryTest);
Slog.i(TAG, "Telephony Registry");
ServiceManager.addService("telephony.registry", new TelephonyRegistry(context));
...
}
...
}
}