Android启动过程包含从Linux内核加载到Home应用程序启动的整个过程。整体流程如下:
Android是基于Linux内核的系统平台。启动时,首先通过bootloader(系统加载器),加载Linux内核。在Linux加载启动时,与普通的Linux启动过程相同,先初始化内核,然后调用init进程。
Init进程启动zygote:解析配置文件:init.rc(系统配置文件)及initXXX.rc(与硬件平台相关的文件)的内容执行一系列的命令,包括创建mount目录,安装文件系统,设置属性,启动属性服务器,启动Socket服务端口-》加载preload-classes和preload-resources(Framework大部分类及资源)-》fork启动新的进程Zygote(其实是由fork和execv共同创建)。
Zygnote孵化第一个进程SystemServer,SystemServer启动各种系统服务线程。SystemServer进程在Android的运行环境中扮演了“神经中枢“的作用,APK应用中能够直接交互的大部分系统服务都在该进程中运行,常见的比如WindowManagerServer(Wms)、ActivityManagerSystemService(AmS)、PackageManagerServer(PmS)等,这些系统服务都是以一个线程的方式存在于SystemServer进程中。SystemServer的main()函数首先调用的是init1()函数,这是一个native函数,内部会进行一些与Dalvik虚拟机相关的初始化工作。该函数执行完毕后,其内部会调用Java端的init2()函数,该函数首先创建了一个ServerThread对象,该对象是一个线程,然后直接运行该线程,于是,从ServerThread的run()方法内部开始真正启动各种服务线程。
基本上每个服务都有对应的Java类,从编码规范的角度来看,启动这些服务的模式可归类为三种:模式一是指直接使用构造函数构造一个服务,由于大多数服务都对应一个线程,因此,在构造函数内部就会创建一个线程并自动运行。模式二是指服务类会提供一个getInstance()方法,通过该方法获取该服务对象,这样的好处是保证系统中仅包含一个该服务对象。模式三是指从服务类的main()函数中开始执行。无论以上何种模式,当创建了服务对象后,有时可能还需要调用该服务类的init()或者systemReady()函数以完成该对象的启动
当以上服务线程都启动后,AMS以systemReady调用完成最后启动,mMainStack.resumeTopActivityLocked(null)-》mService.startHomeActivityLocked启动第一个Activity。至此,FrameWorkd启动完成。
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
|