Android 核心分析 之八------Android 啓動過程詳解

Android Linux 系統啓動有 4 個步驟;

(1) init 進程啓動

(2) Native 服務啓動

(3) System Server Android 服務啓動

(4) Home 啓動

總體啓動框架圖如:

image

 

第一步: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

發佈了1 篇原創文章 · 獲贊 0 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章