Android启动各种系统服务线程

Android启动各种系统服务线程

SystemServer进程在Android的运行环境中扮演了"神经中枢"的作用,APK应用中能够直接交互的大部分系统服务都在该进程中运行,常见的比如WindowManagerServer(Wms)、ActivityManagerSystemService(AmS)、PackageManagerServer(PmS)等,这些系统服务都是以一个线程的方式存在于SystemServer进程中。下面就来介绍到底都有哪些服务线程,及其启动的顺序。

SystemServer的main()函数首先调用的是init1()函数,这是一个native函数,内部会进行一些与Dalvik虚拟机相关的初始化工作。该函数执行完毕后,其内部会调用Java端的init2()函数,这就是为什么Java源码中没有引用init2()的地方,主要的系统服务都是在init2()函数中完成的。

该函数首先创建了一个ServerThread对象,该对象是一个线程,然后直接运行该线程,如以下代码所示:

 public static final void init2() {
        Slog.i(TAG, "Entered the Android system server!");
        Thread thr = new ServerThread();
        thr.setName("android.server.ServerThread");
        thr.start();
    }

于是,从ServerThread的run()方法内部开始真正启动各种服务线程。

基本上每个服务都有对应的Java类,从编码规范的角度来看,启动这些服务的模式可归类为三种,如图所示。

模式一是指直接使用构造函数构造一个服务,由于大多数服务都对应一个线程,因此,在构造函数内部就会创建一个线程并自动运行。

模式二是指服务类会提供一个getInstance()方法,通过该方法获取该服务对象,这样的好处是保证系统中仅包含一个该服务对象。

模式三是指从服务类的main()函数中开始执行。

无论以上何种模式,当创建了服务对象后,有时可能还需要调用该服务类的init()或者systemReady()函数以完成该对象的启动,当然这些都是服务类内部自定义的。为了区分以上启动的不同,以下采用一种新的方式描述该启动过程。比如当一个服务对象是通过模式一创建,并调用init()完成该服务的启动,我们就用模式1.2表示;如果构造函数返回后就已经启动,而无须任何其他调用,即什么都不做(nothing),我们就用模式1.1表示。

表中列出了SystemServer中所启动的所有服务,以及这些服务的启动模式。

                                     

                                                   SystemServer中启动服务列表

服务类名称

作用描述

启动模式

EntropyService

提供伪随机数

1.0

PowerManagerService

电源管理服务

1.2/3

ActivityManagerService

最核心的服务之一,管理Activity

自定义

TelephonyRegistry

通过该服务注册电话模块的事件响应,比如重启、关闭、启动等

1.0

PackageManagerService

程序包管理服务

3.3

AccountManagerService

账户管理服务,是指联系人账户,而不是Linux系统的账户

1.0

ContentService

ContentProvider服务,提供跨进程数据交换

3.0

BatteryService

电池管理服务

1.0

LightsService

自然光强度感应传感器服务

1.0

VibratorService

震动器服务

1.0

AlarmManagerService

定时器管理服务,提供定时提醒服务

1.0

WindowManagerService

Framework最核心的服务之一,负责窗口管理

3.3

BluetoothService

蓝牙服务

1.0 +

DevicePolicyManagerService

提供一些系统级别的设置及属性

1.3

StatusBarManagerService

状态栏管理服务

1.3

ClipboardService

系统剪切板服务

1.0

InputMethodManagerService

输入法管理服务

1.0

NetStatService

网络状态服务

1.0

NetworkManagementService

网络管理服务

NMS.create()

ConnectivityService

网络连接管理服务

2.3

ThrottleService

暂不清楚其作用

1.3

AccessibilityManagerService

辅助管理程序截获所有的用户输入,并根据这

些输入给用户一些额外的反馈,起到辅助的效果

1.0

MountService

挂载服务,可通过该服务调用Linux层面的mount程序

1.0

NotificationManagerService

通知栏管理服务,Android中的通知栏和状

态栏在一起,只是界面上前者在左边,后者在右边

1.3

DeviceStorageMonitorService

磁盘空间状态检测服务

1.0

LocationManagerService

地理位置服务

1.3

SearchManagerService

搜索管理服务

1.0

DropBoxManagerService

通过该服务访问Linux层面的Dropbox程序

1.0

WallpaperManagerService

墙纸管理服务,墙纸不等同于桌面背景,

View系统内部,墙纸可以作为任何窗口的背景

1.3

AudioService

音频管理服务

1.0

BackupManagerService

系统备份服务

1.0

AppWidgetService

Widget服务

1.3

RecognitionManagerService

身份识别服务

1.3

DiskStatsService

磁盘统计服务

1.0

AmS的启动模式如下:

调用main()函数,返回一个Context对象,而不是AmS服务本身。

调用AmS.setSystemProcess()。

调用AmS.installProviders()。

调用systemReady(),当AmS执行完systemReady()后,会相继启动相关联服务的systemReady()函数,完成整体初始化。

关于具体某个服务的内部启动过程,请参照源码,这些过程一般都比较简单。

SystemServer.java文件目录:frameworks\base\services\java\com\android\server\SystemServer.java

该文件中定义了另外一个类:ServerThread(ServerThread extends Thread )

参考:http://book.51cto.com/art/201109/291271.htm

另外:

Android系统进程Zygote启动过程的源代码分析

参考:http://webservices.ctocio.com.cn/4/12163004_5.shtml

猜你喜欢

转载自lzd20021683.iteye.com/blog/1399263
今日推荐