# Android 啟動過程詳解
Android從Linux系統啟動有4個步驟;
(1) init進程啟動
(2) Native服務啟動
(3) System Server,Android服務啟動
(4) Home啟動
總體啟動框架圖如:
[](http://hi.csdn.net/attachment/201005/14/0_1273850751070U.gif)
### 第一步:initial進程(system/core/init)
init進程,它是一個由內核啟動的用戶級進程。內核自行啟動(已經被載入內存,開始運行,并已初始化所有的設備驅動程序和數據結構等)之后,就通過啟動一個用戶級程序init的方式,完成引導進程。init始終是第一個進程.
Init.rc
Init.marvell.rc

Init進程一起來就根據init.rc和init.xxx.rc腳本文件建立了幾個基本的服務:
- ?servicemanamger
- ?zygote
。。。
最后Init并不退出,而是擔當起property service的功能。
#### 1.1腳本文件
init@System/Core/Init
Init.c: parse_config_file(Init.rc)
@parse_config_file(Init.marvel.rc)
解析腳本文件:Init.rc和Init.xxxx.rc(硬件平臺相關)
Init.rc是Android自己規定的初始化腳本(Android Init Language, System/Core/Init/readme.txt)
該腳本包含四個類型的聲明:
- Actions
- Commands
- Services
- Options.
#### 1.2 服務啟動機制
我們來看看Init是這樣解析.rc文件開啟服務的。
(1)打開.rc文件,解析文件內容@ system/core/init/init.c
將service信息放置到service_list中。@ system/core/init parser.c
(2)restart_service()@ system/core/init/init.c
service_start
execve(…).建立service進程。
### 第二步 Zygote
Servicemanager和zygote進程就奠定了Android的基礎。Zygote這個進程起來才會建立起真正的Android運行空間,初始化建立的Service都是Navtive service.在.rc腳本文件中zygote的描述:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
所以Zygote從main(…)@frameworks/base/cmds/app_main.cpp開始。
(1) main(…)@frameworks/base/cmds/app_main.cpp
- 建立Java Runtime
- runtime.start("com.android.internal.os.ZygoteInit", startSystemServer);
(2) runtime.start@AndroidRuntime.cpp
- 建立虛擬機
- 運行:com.android.internal.os.ZygoteInit:main函數。
(3)main()@com.android.internal.os.ZygoteInit//正真的Zygote。
- registerZygoteSocket();//登記Listen端口
- startSystemServer();
- 進入Zygote服務框架。
經過這幾個步驟,Zygote就建立好了,利用Socket通訊,接收ActivityManangerService的請求,Fork應用程序。
### 第三步 System Server
[startSystemServer@com.android.internal.os.ZygoteInit在Zygote](#)上fork了一個進程:?com.android.server.SystemServer.于是SystemServer@(SystemServer.java)就建立了。Android的所有服務循環框架都是建立SystemServer@(SystemServer.java)上。在SystemServer.java中看不到循環結構,只是可以看到建立了init2的實現函數,建立了一大堆服務,并AddService到service Manager。
~~~
main() @ com/android/server/SystemServer
{
init1();
}
~~~
Init1()是在Native空間實現的(com_andoird_server_systemServer.cpp)。我們一看這個函數就知道了,init1->system_init() @System_init.cpp
在system_init()我們看到了循環閉合管理框架。
~~~
{
Call "com/android/server/SystemServer", "init2"
…..
ProcessState::self()->startThreadPool();
?? IPCThreadState::self()->joinThreadPool();
}
~~~
init2()@SystemServer.java中建立了Android中所有要用到的服務。
這個init2()建立了一個線程,來New Service和AddService來建立服務
### 第三步 Home啟動
[在ServerThread@SystemServer.java](#)后半段,我們可以看到系統在啟動完所有的Android服務后,做了這樣一些動作:
(1) 使用xxx.systemReady()通知各個服務,系統已經就緒。
(2)? 特別對于ActivityManagerService.systemReady(回調)
Widget.wallpaper,imm(輸入法)等ready通知。
Home就是在ActivityManagerService.systemReady()通知的過程中建立的。下面是ActivityManagerService.systemReady()的偽代碼:
systemReady()@ActivityManagerService.java
resumeTopActivityLocked()
startHomeActivityLocked();//如果是第一個則啟動HomeActivity。
startActivityLocked(。。。)CATEGORY_HOME
- 前言
- (一)分析方法論探討之設計意圖
- (二)方法論探討之概念空間篇
- (三)手機之硬件形態
- (四)手機的軟件形態
- (五)基本空間劃分
- (六)IPC框架分析 Binder,Service,Service manager
- (七)Service深入分析
- (八)Android 啟動過程詳解
- (九)Zygote Service
- (十)Android GWES之基本原理篇
- (十一)Android GWES之消息系統
- (十二)Android GEWS窗口管理之基本架構原理
- (十三)Android GWES之Android窗口管理
- (十四)Android GWES之輸入系統
- (十五)Android輸入系統之輸入路徑詳解
- (十六)Android電話系統-概述篇
- (十七)電話系統之rilD
- (十八)Android電話系統之RIL-Java
- (十九)電話系統之GSMCallTacker
- (二十)Android應用程序框架之無邊界設計意圖
- (二十一)Android應用框架之AndroidApplication
- (二十二)Android應用框架之Activity
- (二十三)Andoird GDI之基本原理及其總體框架
- (二十四)Android GDI之顯示緩沖管理
- (二十五)Android GDI之共享緩沖區機制
- (二十六)Android GDI之SurfaceFlinger
- (二十七)Android GDI 之SurfaceFlinger之動態結構示意圖
- (二十八)Android GDI之Surface&Canvas