Android 系統啓動過程

文章來源於網絡,心得來源於整理。
 
Android 系統啓動過程

Android 從系統啓動有4個步驟:

1, init進程啓動

2. Native服務啓動

3.System Server,Android服務啓動

4.Home啓動


第一步: Initial進程(System\core\init)

init 進程,它是一個由內核啓動的用戶級進程.內核自行啓動(已經被載入內存,開始運行,並已初始化所有的設備驅動程序和數據結構等)之後,就通過啓動一個用戶級程序init的方式,完成引導進程.init始終是第一個進程.

init.rc

init.marvell.rc

Init進程運行就根據init.rc和 init.XX.rc腳本建立了幾個基本的服務:

servicemanager,zygote....

最後Ini並不退出,而是擔當起property service 的功能.

1.1 腳本文件

init@System/core/Init

init.c : parse_config_file(Init.rc)

@parse_config_file(Init.marvel.rc)

解析腳本文件init.rc和init.XXX.rc(硬件平臺相關)\

Init.rc是Android自己規定的初始化腳本(Android init language,System/core/init/readme.txt)

該腳本中包含四個類型的聲明:

Actions

Commands

Services

Options.

1.2 服務啓動機制

我們來看看Init是怎樣解析.rc文件 開啓服務的/

打開.rc文件,解析內容@system/core/init/init.c將Service信息放置到Service_list中.@system\core\init parser.c

restart_service()@system\core\init\init.c

Service_start

execve(...).建立Service進程.

第二步 Zygote

ServiceManager和Zygote進程奠定了Android的基礎.Zygote這個進程運行都會建立真正的Android運行空間,初始化建立的Service都是Native Service. 在.rc腳本中zygote的描述:

service zygote/system/bin/app_process - Xzygote/system/bin --zyote --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) [email protected]


建立虛擬機
運行:com.android.internal.os.ZygoteInit:main函數。

(3)main()@com.android.internal.os.ZygoteInit//正真的 Zygote。

registerZygoteSocket();//登記Listen端口
startSystemServer();
進入Zygote服務框架。
經過這幾個步驟,Zygote就建立好了,利用Socket通訊,接收ActivityManangerService的請
求,Fork應用程序。

第三步 System Server

[email protected]在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啓動
[email protected]後半段,我們可以看到系統在啓動完所有的 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


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章