天天看點

Android 啟動過程詳解

Android從Linux系統啟動有4個步驟;

(1) init程序啟動

(2) Native服務啟動

(3) System Server,Android服務啟動

(4) Home啟動

總體啟動架構圖如:

Android 啟動過程詳解

     init程序,它是一個由核心啟動的使用者級程序。核心自行啟動(已經被載入記憶體,開始運作,并已初始化所有的裝置驅動程式和資料結構等)之後,就通過啟動一個使用者級程式init的方式,完成引導程序。init始終是第一個程序.

Init.rc

Init.marvell.rc

Android 啟動過程詳解

Init程序一起來就根據init.rc和init.xxx.rc腳本檔案建立了幾個基本的服務:

 servicemanamger

 zygote

。。。

最後Init并不退出,而是擔當起property

service的功能。

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.

我們來看看Init是這樣解析.rc檔案開啟服務的。

(1)打開.rc檔案,解析檔案内容@

system\core\init\init.c

将service資訊放置到service_list中。@

system\core\init parser.c

(2)restart_service()@

service_start

execve(…).建立service程序。

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) [email protected]

建立虛拟機

運作:com.android.internal.os.ZygoteInit:main函數。

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

registerZygoteSocket();//登記Listen端口

startSystemServer();

進入Zygote服務架構。

經過這幾個步驟,Zygote就建立好了,利用Socket通訊,接收ActivityManangerService的請求,Fork應用程式。

[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來建立服務

[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