- 浏览: 160221 次
- 性别:
- 来自: 深圳
最新评论
-
yong7356:
学习了。。。。。。。。。。。。
Android 如何建立AIDL -
910310lenfeng:
小有收获
Paint方法setXfermode -
ihopethatwell:
修改/data/data 权限,修改那几处?
Android——init.rc脚本 -
lyltiger:
http://www.qianxk.com wifi分析
Android Wifi模块分析(二) -
liuborama:
...
Android2.2下实现Ethernet上网
9.4 SystemServer进程的启动
http://book.51cto.com/art/201109/291270.htm
《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 启动各种系统服务线程
《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()函数,完成整体初始化。
关于具体某个服务的内部启动过程,请参照源码,这些过程一般都比较简单。
发表评论
-
如何向android的framework里添加新类
2011-08-19 16:23 1267http://xxw8393.blog.163.c ... -
java和C设置的系统属性-互相访问
2011-06-23 11:29 1263JAVA import android.os.Syst ... -
Android——init.rc脚本
2011-06-16 10:01 5061http://java-admin.iteye.com/blo ... -
android 增加内部flash时容易忘记的一点-数据库操作-删除文件
2011-05-31 15:06 3083其他中间层做好后,发现在Gallery中无法删除flash(或 ... -
MIPS android 编译总结
2011-05-24 09:29 2003http://www.huomo.cn/developer/a ... -
Android Wifi模块分析(六)
2011-05-09 18:08 1083Android Wifi模块分析(六 ... -
Android Wifi模块分析(五)
2011-05-09 18:05 1046Android Wifi模块分析(五) 本文来自:http: ... -
Android Wifi模块分析(四)
2011-05-09 14:13 1178Android Wifi模块分析(四) 2010-02-08 ... -
Android Wifi模块分析(三)
2011-05-09 14:10 1490Android Wifi模块分析(三) 本文来自:http: ... -
Android Wifi模块分析(一)
2011-05-09 14:09 1696Android Wifi模块分析(一 ... -
Android Wifi模块分析(二)
2011-05-09 14:07 2054Android Wifi模块分析(二) 本文来自:http: ... -
Android Wifi模块分析(总览)
2011-05-09 14:05 1705Android Wifi模块分析(总览) 本文来自:http ... -
关于Android2.2定制出厂默认输入法的一些心得
2011-05-04 14:10 2298有些输入法预制到系统中时默认情况下是不能直接使用的,要在设置- ... -
Android2.2下实现Ethernet上网
2011-05-03 16:19 1673最近在做Android2.2实现Ethernet上网,在网上找 ... -
AIDL(android 接口描述语言)
2011-04-29 10:21 1032http://www.devdiv.com/foru ... -
Android自带音乐播放器专辑图片相同的问题
2011-04-19 16:41 2102音乐播放器是从MediaProvi ... -
Android 多媒体扫描过程
2011-04-18 10:25 1227本文来自:http://yueguc.iteye.com/bl ... -
Android学习笔记--Binder
2011-04-15 20:14 9946(一) 概述 android的binder机制 ...
相关推荐
在 Zygote 进程启动过程中,还有一个非常重要的步骤,就是创建一个unix domain socket 资源,这个 socket 资源是用来作本地进程间通信用的。这个 socket 资源的名称为"zygote",它位于 /dev/socket 目录下。Activity...
1. **SystemServer进程启动**:在Zygote进程中通过调用`startSystemServer()`方法启动SystemServer进程。 2. **Android服务启动**:SystemServer启动后,会依次启动一系列重要的Android服务,如`ActivityManager...
4. **SystemServer进程启动**:SystemServer进程负责管理Android系统的整体状态,包括用户界面、服务管理、资源调度等。它启动并初始化各种核心服务,如ActivityManagerService(控制应用的生命周期)、...
本篇文章将深入探讨从`init`进程启动到`system_server`启动的详细流程。 #### 2. 系统启动基本原理 ##### 2.1 内核空间与用户空间 - **内核空间**:内核空间是操作系统内核运行的空间,包括了所有内核模块和驱动...
6. SystemServer 进程启动:启动 Binder 线程池和 SystemServiceManager,并且启动各种系统服务。 在 SystemServer 中,会启动 framework 层 Bluetooth 相关的服务逻辑。蓝牙系统服务的启动流程可以分为两个阶段:...
3. **SystemServer进程启动**:system_server进程由Zygote启动,它负责启动一系列的核心服务,包括但不限于SurfaceFlinger和AudioFlinger。这些服务启动后,会向ServiceManager注册自己。 4. **启动其他Android服务*...
Android zygote服务/SystemServer启动流程/Activity创建,本文档继承Android init的分析,继续往下分析Zygote进程、SystemServer进程的创建、Activity的建立
它负责初始化ART虚拟机,并通过fork操作来启动后续的多个进程,如systemServer进程等。 #### 二、Zygote启动流程细节 ##### 1. app_main.cpp的`main()`方法 Zygote启动的第一步是在`app_main.cpp`中的`main()`...
紧接上两篇《 Android启动-init介绍》和《Android启动-Zygote启动介绍》Linux内核启动之后,执行第一个进程 Init-->init创建Zygote-->fork出SystemServer。 这里我们就来研究一下SystemServer的创建过程。
Android 系统从 SystemServer 开始的 Launcher 启动详细流程 Android 系统启动流程是一个复杂的过程,从 SystemServer 开始到 Launcher 的启动涉及到多个组件和服务的协作。本文将详细介绍 Android 系统从 ...
当SystemServer进程启动后,会进一步初始化并运行关键服务,包括窗口管理服务(WindowManagerService)。 在`WindowManagerService`的初始化过程中,我们可以看到它创建了一个`KeyQ`对象,这是`KeyInputQueue`的一个...
1. **systemserver启动**:Zygote进程启动systemserver进程。 2. **ActivityManagerService初始化**:systemserver创建ActivityManagerService并初始化。 3. **启动Launcher**:ActivityManagerService调用相关方法...
在这个过程中,Zygote进程由init进程启动,而SystemServer进程和应用进程则由Zygote进程启动。接下来,我们将依据Android 6.0版本的源码来详细分析Zygote进程的启动流程。 #### 主要步骤解析 ##### 1. 初始化阶段 ...
Zygote进程启动流程 2 SystemServer 进程启动流程 3 Launcher 启动流程 4 Application 启动流程 5 系统 Mainfest 文件解析流程 6 Handler、Looper、MessageQueue 7 Fragment、FragmentManager、Activity 8 LRU算法 9...
最关键的一项是最后一项,指定了新进程启动后将加载的第一个Java类——`com.android.server.SystemServer`。这一设定确保了新进程能够正确地进入`SystemServer`的初始化流程。 **第二步:孵化新进程** 接着,调用...
- **启动**:SystemServer进程是由zygote进程启动的第一个进程,它是一个完全独立于其父进程的新进程。 - **系统服务注册**:SystemServer启动后,会初始化并注册各个系统服务,如ActivityManagerService、Power...
4. **重新启动服务**:某些更改可能需要系统服务的重启才能生效。你需要通过`SystemServer`接口或者其他系统服务来实现。 5. **注意事项**:这是一项高级操作,错误的修改可能导致系统不稳定。务必谨慎行事,并且仅...