Android 從 Linux 系統啓動有 4 個步驟;
(1) init 進程啓動
(2) Native 服務啓動
(3) System Server , Android 服務啓動
(4) Home 啓動
總體啓動框架圖如:
第一步:initial 進程 (system/core/init)
init 進程,它是一個由內核啓動的用戶級進程。內核自行啓動(已經被載入內存,開始運行,並已初始化所有的設備驅動程序和數據結構等)之後,就通過啓動一個用戶級程序 init 的方式,完成引導進程。 init 始終是第一個進程 .
I nit.rc
I nit.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
S ervicemanager 和 zygote 進程就奠定了 Android 的基礎。 Z ygote 這個進程起來纔會建立起真正的 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 )。我們一看這個函數就知道了, i nit1->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 啓動
在 [email protected] 後半段,我們可以看到系統在啓動完所有的 Android 服務後,做了這樣一些動作:
(1) 使用 xxx.systemReady() 通知各個服務,系統已經就緒。
(2) 特別對於 ActivityManagerService.systemReady( 回調 )
W idget.wallpaper,imm( 輸入法 ) 等 ready 通知。
Home 就是在 ActivityManagerService.systemReady() 通知的過程中建立的。下面是 ActivityManagerService.systemReady() 的僞代碼:
systemReady()@ActivityManagerService.java
resumeTopActivityLocked()
startHomeActivityLocked(); // 如果是第一個則啓動 HomeActivity 。
startActivityLocked (。。。) CATEGORY_HOME