Android知识梳理:System Service
在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负责管理系统服务。
?
?
?
?
?
?