`

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负责管理系统服务。

 

 

 

 

 

 

分享到:
评论

相关推荐

    深入理解Android:卷I--详细书签版

    针对性强,注重实际应用开发需求,书中所涵盖的知识点都是android应用开发者和系统开发者需要重点掌握的。  全书共10章,第1章介绍了阅读本书所需要做的准备工作,主要包括对android系统架构和源码阅读方法的介绍;...

    自己整理Android面试题

    - 绑定Service:使用`bindService()`,Service与调用者绑定,调用者关闭时Service可能随之关闭,需实现`IBinder`接口。 以上是Android面试中常见的问题和答案,涵盖了Activity管理、数据持久化、界面布局和服务等...

    Android技术面试资料整理

    ### Android技术面试资料整理 #### 1. Android的四大组件及其作用 - **Activity**:是Android应用程序中负责用户交互的主要部分。一个Activity通常对应着一个屏幕,展示UI元素并与用户进行交互。当一个Activity被...

    Android面试题带答案

    根据提供的文件内容,我们可以整理出以下关键知识点,这些知识点涵盖了Android开发的基础概念和技术要点: ### 内存回收机制 **知识点概述:** 内存回收是Java虚拟机(JVM)的一个自动管理过程,它负责释放不再使用...

    Android技术面试整理附有详细答案

    ### Android技术面试整理知识点 #### 1. Android的四大组件及其作用 - **Activity**:作为用户界面的主要组成部分,Activity负责展示UI并处理用户输入。每个Activity代表一个屏幕,可以包含多个视图(View),用于...

    【优亿Android特刊】第二十二期:Android源码修改

    通过对以上知识点的梳理,我们可以看到Android源码修改不仅涉及到源码结构的理解,还需要掌握编译环境的搭建、特定功能的实现原理以及如何进行有效的源码分析。这对于想要深入研究Android系统的开发者来说是非常宝贵...

    Android进程整理

    系统启动架构图:上图在Android系统-开篇中...在Android进程中,有3个非常重要的进程(即图中的深紫色项),如下:system_server:是由zygote孵化而来的,是zygote的首席大弟子,托起整个Javaframework的所有service,比

    自己整理的android面试题

    【Android面试核心知识点详解】 1. **ListView的优化** - **原理**:ListView通过`getCount()`获取数据集的大小,然后通过`getView()`方法循环绘制每一项。每个View在绘制完毕后会被缓存起来,以便后续复用。 - *...

    Android软件安全审计及漏洞修复经验谈

    - **MasterKey漏洞**:这是一个非常著名的Android漏洞,主要涉及系统签名的APP通过`android:sharedUserId`申请了`android.uid.system`这个UID,从而可以注入恶意代码获得root权限。此漏洞的存在严重威胁到了Android...

    Android 编程 andbook 中文版

    通过上述知识点的梳理,我们可以看到《Andbook—Android编程》中文版覆盖了从Android基础概念、开发环境搭建到具体组件的使用等多个方面,为学习者提供了全面的学习材料。无论是初学者还是有一定经验的开发者,都能...

    Android 常用系统广播

    以下是根据提供的文件内容整理的Android常用系统广播知识点: 1. Intent.ACTION_AIRPLANE_MODE_CHANGED:当用户关闭或打开飞行模式时,系统会发送该广播。应用程序可以监听这一事件来响应飞行模式的变化。 2. ...

    Android应用框架原理与程序设计.zip

    5. Service:后台运行的组件,可以执行长时间操作而无需用户交互。 6. View System:构建用户界面的基石,包含各种视图控件和布局。 二、Android应用程序开发 Android应用主要由Java代码编写,基于Android SDK。...

    android 核心包源代码【放入eclipse直接可看】

    1. **系统框架层(System Framework)**:这是Android系统的核心,包含了大量的服务和接口,如ActivityManagerService负责管理应用程序的生命周期,TelephonyManagerService处理电话功能,PowerManagerService控制...

    dp18_ap6330整理完工20170209_1129.7z

    frameworks/native/data/etc/android.hardware.bluetooth_le.xml:system/etc/permissions/android.hardware.bluetooth_le.xml \ frameworks/native/data/etc/android.software.verified_boot.xml:system/etc/...

    外文翻译--基于Android的移动终端的智能信息集成系统的设计与实现(英文).pdf

    通过以上知识点的梳理,可以了解到该文档讲述的主要是如何利用Android移动设备及其相关技术(中间件、Web服务、XML解析技术)来构建一个可以提供个性化服务的智能信息集成系统,从而满足用户对于随时随地获取信息的...

    android笔试面试大全重新整理版

    ### Android笔试面试知识点详解 #### 一、内存回收机制 **题目**: 下列哪些语句关于内存回收的说明是正确的? - **选项**: (b) - A、程序员必须创建一个线程来释放内存 - B、内存回收程序负责释放无用内存 - C、...

    Android群英传-前言.md

    ### Android群英传知识点梳理 #### 一、Android体系与系统架构 **1.1 Google生态系统** - **定义与组成**:Google生态系统是指由Google公司主导建立的一套围绕Android操作系统展开的技术和服务生态。该生态包括但...

    CTZUDNN6.rar_android开发

    在Android应用开发中,时间的获取通常涉及到System.currentTimeMillis()或SystemClock.elapsedRealtime()等API的使用,但具体实现可能会根据应用需求进行定制,例如处理时区转换、网络同步或者其他时间相关的功能。...

Global site tag (gtag.js) - Google Analytics