Android 核心分析 之八——Android 啟動過程詳解

來源:互聯網
上載者:User

 

from :http://blog.csdn.net/maxleng/article/details/5508372

 

Android 啟動過程詳解

 

Android從Linux系統啟動有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.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這個進程起來才會建立起真正的AndroidRunspace,初始化建立的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(IME)等ready通知。

 

Home就是在ActivityManagerService.systemReady()通知的過程中建立的。下面是ActivityManagerService.systemReady()的虛擬碼:

systemReady()@ActivityManagerService.java

resumeTopActivityLocked()

startHomeActivityLocked();//如果是第一個則啟動HomeActivity。

startActivityLocked(。。。)CATEGORY_HOME

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.