SystemServer vs ServiceManager
来源:互联网 发布:后缀io域名 编辑:程序博客网 时间:2024/06/07 07:09
在Android系统中有很多内置的软件,例如,当手机接到来电时,会显示对方的电话号。也可以根据周围的环境将手机设置成震动或静音。如果想把这些功能加到自己的软件中应该怎么办呢?答案就是“系统服务”。在Android系统中提供了很多这种服务,通过这些服务,就可以像Android系统的内置软件一样随心所欲地控制Android系统了。系统服务(System Services)并非Android开发应用程序时,所涉及的Service(后台应用服务程序,位于Android系统应用层)的概念。而是Android操作系统Java应用程序下层的,伴随操作系统启动而运行的系统后台服务程序(位于Android系统的FrameWork层)。它是Android系统运行的基石,它配合binder(Android多进程通讯方法)、dalvik虚拟机和Android应用程序构成了一个多进程交互通讯,交互服务的Android系统。
Android体系架构中四种意义上服务:Native服务、Android服务、Init空间的服务、应用层空间的服务。这里的system service属于android服务这一块。
1.浏览一下Android的system service
在命令行启动shell
adb shell
执行下面指令
#service list
Found 47 services:
0 phone: [com.Android.internal.telephony.ITelephony]
1 iphonesubinfo: [com.Android.internal.telephony.IPhoneSubInfo]
2 simphonebook: [com.Android.internal.telephony.IIccPhoneBook]
3 isms: [com.Android.internal.telephony.ISms]
4 appwidget: [com.Android.internal.appwidget.IAppWidgetService]
42 SurfaceFlinger: [Android.ui.ISurfaceComposer]
43 media.audio_policy: [Android.media.IAudioPolicyService]
46 media.audio_flinger: [Android.media.IAudioFlinger]
从结果看来Android后台有很多的system service,他们是分散在不同进程中的线程实体。
2.SystemServer
SystemServer是Android系统的一个核心进程,它是由zygote进程创建的,因此在android的启动过程中位于zygote之后。android的所有服务循环都是建立在 SystemServer之上的。在SystemServer中,将可以看到它建立了android中的大部分服务,并通过ServerManager的add_service方法把这些服务加入到了ServiceManager的svclist中。从而完成ServcieManager对服务的管理。
3.Service Manager
Service manager是管理以上services的一个进程,可以在adb shell中运行ps看看进程列表就知道了。
源代码位于:
frameworks/base/cmds/servicemanager
执行方式:
他是用c和c++语言编写的natvie可以执行文件。在Android中称之为EXECUTABLE,这个名称很重要因为Android.mk文件中用这个名字来确定他是可以执行的二进制文件。
4.Service Manager的启动过程和方法
开始有点复杂了,也该开始进入真正的Linux了。众所周知Linux的启动和文件系统的加载需要一个ramdisk,ramdisk负责让Linux kernel加载第一个进程init进程。那么这一切是怎么发生的呢?
在Android的ramdisk中就有这样一个可执行文件init,我们可以去看一下
system/core/init/init.c
int main(int argc, char **argv)
{
。。。。。。
parse_config_file("/init.rc");
。。。。。。
这个文件会编译出一个init的二进制可执行文件,并且去读init.rc文件。我们称init.rc文件为Android启动配置脚本。
现在我们打开init.rc文件,(如果您不知道init.rc,请参考google吧,了解下它的语法)
## Daemon processes to be run by init.
##
service servicemanager /system/bin/servicemanager
user system
critical
onrestart restart zygote
onrestart restart media
从这里可以看出servicemanager 是init通过init.rc加载的第一个进程,接下来启动了zygote和media。
继续阅读init.rc
servicemanager进程运行起来以后,我们就可以应用binder来应用servicemanager提供的服务函数去创建
system-server和mediaserver了,下面是init.rc中的代码
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
#system-server的创建是通过app_process这个二进制程序去加载的
socket zygote stream 666
onrestart write /sys/Android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
service media /system/bin/mediaserver #mediaserver的启动代码比较简单,看看就知道了不用参数就创建了
user media
group system audio camera graphics inet net_bt net_bt_admin
5.回过头再看系统的进程列表
# ps
USER PID PPID VSIZE RSS WCHAN PC NAME
root 1 0 296 204 c009a694 0000c93c S /init
root 2 0 0 0 c004dea0 00000000 S kthreadd
root 25 1 728 316 c003d444 afe0d6ac S /system/bin/sh
system 26 1 796 256 c019a810 afe0ca7c S /system/bin/servicemanager
root 30 1 82860 26580 c009a694 afe0cba4 S zygote
media 31 1 20944 3184 ffffffff afe0ca7c S /system/bin/mediaserver
root 32 1 784 280 c0209468 afe0c7dc S /system/bin/installd
keystore 33 1 1616 396 c01a65a4 afe0d40c S /system/bin/keystore
root 34 1 728 272 c003d444 afe0d6ac S /system/bin/sh
root 35 1 824 332 c00b7dd0 afe0d7fc S /system/bin/qemud
root 37 1 1308 152 ffffffff 0000eca4 S /sbin/adbd
root 44 34 780 304 c0209468 afe0c7dc S /system/bin/qemu-props
system 52 30 158356 37804 ffffffff afe0ca7c S system_server
app_1 92 30 108640 20580 ffffffff afe0da04 S com.Android.inputmethod.pinyin
radio 93 30 122852 23340 ffffffff afe0da04 S com.Android.phone
app_1 98 30 143244 34888 ffffffff afe0da04 S Android.process.acore
我们注意观察进程列表的PID和PPID,我们要通过实际的列表去理清他们的亲缘关系。
servicemanager是init的子进程
mediaserver是init的子进程
zygote是init的子进程,管理所有虚拟机实例
system_server和所有的java应用程序是zygote的子进程。system_server负责管理系统服务。
SystemServer进程
SystemServer进程在Android的运行环境中扮演了"神经中枢"的作用,APK应用中能够直接交互的大部分系统服务都在该进程中运 行,常见的比如WindowManagerServer(Wms)、ActivityManagerSystemService(AmS)、 PackageManagerServer(PmS)等,这些系统服务都是以一个线程的方式存在于SystemServer进程中。下面就来介绍到底都有 哪些服务线程,及其启动的顺序。
SystemServer的main()函数首先调用的是init1()函数,这是一个native函数,内部会进行一些与Dalvik虚拟机相关 的初始化工作。该函数执行完毕后,其内部会调用Java端的init2()函数,这就是为什么Java源码中没有引用init2()的地方,主要的系统服 务都是在init2()函数中完成的。
该函数首先创建了一个ServerThread对象,该对象是一个线程,然后直接运行该线程,如以下代码所示:
于是,从ServerThread的run()方法内部开始真正启动各种服务线程。
基本上每个服务都有对应的Java类,从编码规范的角度来看,启动这些服务的模式可归类为三种,如图9-3所示。
图9-3 不同服务的启动方式模式一是指直接使用构造函数构造一个服务,由于大多数服务都对应一个线程,因此,在构造函数内部就会创建一个线程并自动运行。
模式二是指服务类会提供一个getInstance()方法,通过该方法获取该服务对象,这样的好处是保证系统中仅包含一个该服务对象。
模式三是指从服务类的main()函数中开始执行。
无论以上何种模式,当创建了服务对象后,有时可能还需要调用该服务类的init()或者systemReady()函数以完成该对象的启动,当然这 些都是服务类内部自定义的。为了区分以上启动的不同,以下采用一种新的方式描述该启动过程。比如当一个服务对象是通过模式一创建,并调用init()完成 该服务的启动,我们就用模式1.2表示;如果构造函数返回后就已经启动,而无须任何其他调用,即什么都不做(nothing),我们就用模式1.1表示。
表9-2列出了SystemServer中所启动的所有服务,以及这些服务的启动模式。
表9-2 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 vs ServiceManager
- SystemServer vs ServiceManager
- Android 之 ServiceManager与服务管理, 以及SystemServer核心进程
- SystemServer
- ServiceManager
- ServiceManager
- SystemServer 分析
- Android SystemServer
- SystemServer systemReady()
- SystemServer分析
- 了解systemServer
- ServiceManager & SystemService
- android----ServiceManager
- ServiceManager 学习
- ServiceManager分析
- ServiceManager总结
- killall servicemanager
- ServiceManager 学习
- 并查集路径压缩
- Cocos2d-x--使用Cocos2d-x v3.0.0
- 百度的一道笔试题
- poj 2826 Easy Problem
- linux的HZ, Tick, Jiffies
- SystemServer vs ServiceManager
- 多核多线程对int,float等类型的读原子性
- 白话经典算法系列之四 直接选择排序及交换二个数据的正确实现
- java_枚举类枚举值
- LOGFONT设置字体
- chrome html文档边框消除
- cf-337C Quiz
- 汇编语言程序设计学习笔记(二)(Linux 版)
- 在windows应用程序上输出透明字体