`
folksy
  • 浏览: 159815 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

SystemServer进程的启动

阅读更多

9.4 SystemServer进程的启动

http://book.51cto.com/art/201109/291270.htm

 

2011-09-14 21:16 柯元旦 电子工业出版社 我要评论(0 ) 字号:T | T

综合评级:

想读(18)    在读(2)    已读(4)     品书斋鉴(1)     已有24 人发表书评

一键收藏,随时查看,分享好友!

《Android内核剖析》第9章Framework的启动过程,详细分析了android内核的内部机制, 本章将从init.rc文件开始,继续介绍Android内核的启动过程,以及该过程中相关的重要模块的交互逻辑。本节为大家介绍 SystemServer进程的启动。

AD:

9.4  SystemServer进程的启动

SystemServer进程是zygote孵化出的第一个进程,该进程是从ZygoteInit.java的main()函数中调用 startSystemServer()开始的。与启动普通进程的差别在于,zygote类为启动SystemServer提供了专门的函数 startSystemServer(),而不是使用标准的forAndSpecilize()函数,同时,SystemServer进程启动后首先要做 的事情和普通进程也有所差别。

startSystemServer()函数的关键代码有三处。

第一处,定义了一个String[]数组,数组中包含了要启动的进程的相关信息,其中最后一项指定新进程启动后装载的第一个Java类,此处即为com.android.server.SystemServer类,如以下代码所示:

 

第二处,调用forkSystemServer()从当前的zygote进程孵化出新的进程,如以下代码所示。该函数是一个native函数,其作用与folkAndSpecilize()相似。

 

第三处,新进程启动后,首先执行的代码如下:

 

在handleSystemServerProcess()函数中主要完成两件事情,第一是关闭Socket服务端,第二是执行 com.android.server.SystemServer类的main()函数。除了这两个主要事情外,还做了一些额外的运行环境配置,这些配置 主要在commonInit()和zygoteInitNative()两个函数中完成。有兴趣的读者可以仔细分析这两个函数的内部实现。

一旦SystemServer的进程环境配置好后,就从SystemServer类的main()函数中开始运行,本节主要介绍该类的内部执行过程。

 

9.4.1 启动各种系统服务线程

2011-09-14 21:16 柯元旦 电子工业出版社 我要评论(0 ) 字号:T | T

综合评级:

想读(18)    在读(2)    已读(4)     品书斋鉴(1)     已有24 人发表书评

一键收藏,随时查看,分享好友!

《Android内核剖析》第9章Framework的启动过程,详细分析了android内核的内部机制,本章将从init.rc文件开始,继续介绍Android内核的启动过程,以及该过程中相关的重要模块的交互逻辑。本节为大家介绍启动各种系统服务线程。

AD:

9.4.1  启动各种系统服务线程

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()函数,完成整体初始化。

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

 

【责任编辑:云霞 TEL:(010)68476606】
【责任编辑:云霞 TEL:(010)68476606】
分享到:
评论

相关推荐

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

    在 Zygote 进程启动过程中,还有一个非常重要的步骤,就是创建一个unix domain socket 资源,这个 socket 资源是用来作本地进程间通信用的。这个 socket 资源的名称为"zygote",它位于 /dev/socket 目录下。Activity...

    Android 启动过程详解

    1. **SystemServer进程启动**:在Zygote进程中通过调用`startSystemServer()`方法启动SystemServer进程。 2. **Android服务启动**:SystemServer启动后,会依次启动一系列重要的Android服务,如`ActivityManager...

    Android启动流程分析

    4. **SystemServer进程启动**:SystemServer进程负责管理Android系统的整体状态,包括用户界面、服务管理、资源调度等。它启动并初始化各种核心服务,如ActivityManagerService(控制应用的生命周期)、...

    android系统从init进程开始到systemserver启动详细流程

    本篇文章将深入探讨从`init`进程启动到`system_server`启动的详细流程。 #### 2. 系统启动基本原理 ##### 2.1 内核空间与用户空间 - **内核空间**:内核空间是操作系统内核运行的空间,包括了所有内核模块和驱动...

    android bluetooth framework,application 层分析

    6. SystemServer 进程启动:启动 Binder 线程池和 SystemServiceManager,并且启动各种系统服务。 在 SystemServer 中,会启动 framework 层 Bluetooth 相关的服务逻辑。蓝牙系统服务的启动流程可以分为两个阶段:...

    Android 8.1zygote服务 SystemServer启动流程 Activity创建

    Android zygote服务/SystemServer启动流程/Activity创建,本文档继承Android init的分析,继续往下分析Zygote进程、SystemServer进程的创建、Activity的建立

    Zygote启动流程-systemServer启动流程-homeLauncher启动

    它负责初始化ART虚拟机,并通过fork操作来启动后续的多个进程,如systemServer进程等。 #### 二、Zygote启动流程细节 ##### 1. app_main.cpp的`main()`方法 Zygote启动的第一步是在`app_main.cpp`中的`main()`...

    Android启动-SystemServer的启动过程介绍

    紧接上两篇《 Android启动-init介绍》和《Android启动-Zygote启动介绍》Linux内核启动之后,执行第一个进程 Init-->init创建Zygote-->fork出SystemServer。 这里我们就来研究一下SystemServer的创建过程。

    android系统从systemserver开始的launcher启动详细流程.doc

    Android 系统从 SystemServer 开始的 Launcher 启动详细流程 Android 系统启动流程是一个复杂的过程,从 SystemServer 开始到 Launcher 的启动涉及到多个组件和服务的协作。本文将详细介绍 Android 系统从 ...

    Android 事件驱动流程

    当SystemServer进程启动后,会进一步初始化并运行关键服务,包括窗口管理服务(WindowManagerService)。 在`WindowManagerService`的初始化过程中,我们可以看到它创建了一个`KeyQ`对象,这是`KeyInputQueue`的一个...

    android系统从systemserver开始的launcher启动详细流程

    1. **systemserver启动**:Zygote进程启动systemserver进程。 2. **ActivityManagerService初始化**:systemserver创建ActivityManagerService并初始化。 3. **启动Launcher**:ActivityManagerService调用相关方法...

    Android Zygote启动流程源码解析

    在这个过程中,Zygote进程由init进程启动,而SystemServer进程和应用进程则由Zygote进程启动。接下来,我们将依据Android 6.0版本的源码来详细分析Zygote进程的启动流程。 #### 主要步骤解析 ##### 1. 初始化阶段 ...

    leetcode安卓-jfson.github.io:关于安卓

    Zygote进程启动流程 2 SystemServer 进程启动流程 3 Launcher 启动流程 4 Application 启动流程 5 系统 Mainfest 文件解析流程 6 Handler、Looper、MessageQueue 7 Fragment、FragmentManager、Activity 8 LRU算法 9...

    System Server启动

    最关键的一项是最后一项,指定了新进程启动后将加载的第一个Java类——`com.android.server.SystemServer`。这一设定确保了新进程能够正确地进入`SystemServer`的初始化流程。 **第二步:孵化新进程** 接着,调用...

    Android Launch Process(安卓系统启动过程)

    - **启动**:SystemServer进程是由zygote进程启动的第一个进程,它是一个完全独立于其父进程的新进程。 - **系统服务注册**:SystemServer启动后,会初始化并注册各个系统服务,如ActivityManagerService、Power...

    修改system读取sdcard权限.rar

    4. **重新启动服务**:某些更改可能需要系统服务的重启才能生效。你需要通过`SystemServer`接口或者其他系统服务来实现。 5. **注意事项**:这是一项高级操作,错误的修改可能导致系统不稳定。务必谨慎行事,并且仅...

Global site tag (gtag.js) - Google Analytics