Android系统服务概要

Author Avatar
罗炜光 10月 05, 2016
  • 在其它设备中阅读本文章

本篇基于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 Flinger

  • Package 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进程启动运行

init.rc

service media /system/bin/mediaserver
    user media
    group system audio camera graphics inet net_bt net_bt_admin net_raw

生成并初始化本地服务

main_mediaserver

int main(int argc, char** argv)
{
    ...
    AudioFlinger::instantiate();
    MediaPlayerService::instantiate();
    CameraService::instantiate();
    AudioPolicyService::instantiate();
    ...
}

分析各系统服务的初始化代码

系统服务与Framework中的其他模块通信时,使用Binder IPC,系统服务这类服务提供者必须把相关信息注册到Context Manager中,以便Android应用程序这类服务使用者能够使用其提供的服务

各本地服务的初始化代码形式都相似,即首先使用new运算符生成服务的实例,而后调用addService()函数将各个服务注册到Context Manager中

AudioFlinger::instantiate

void AudioFlinger::instantiate() {
    defaultServiceManager()->addService(
            String16("media.audio_flinger"), new AudioFlinger());
}

MediaPlayerService::instantiate

void MediaPlayerService::instantiate() {
    defaultServiceManager()->addService(
            String16("media.player"), new MediaPlayerService());
}

CameraService::instantiate

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.

init.rc

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

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系统服务

init2

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中

SystemServer

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));
        ...
    }
    ...
    }
}

参考资料

Amdroid框架揭秘