android framework 啟動流程

來源:互聯網
上載者:User

嵌入式裝置啟動時bootloader載入linux核心,linux核心啟動後運行第一個使用者級進程init,從此進程進入android世界,所以,android是一個架構而不是kernel。
在linux系統啟動時,核心引導參數上一般都會設定“init=/init”,當android 最底層linux kernel 啟動後會執行一個使用者級進程init,此進程為所有進程的父進程,進程號為1,這裡為整個android架構的入口,init進程為android內所有進程的父進程。init 可執行程式一般位於/xbin/init 下,init程式源碼在Android源碼的system/core/init中,我們的分析就從main開始進入android framework。

/system/core/init/init.c#main

init進程 為標準linux進程,它可以使用linux 核心提供的api,也可以使用標準庫。

init 進程分兩部分,boot 部分 及 daemon部分,

int main(int argc, char **argv)
{
    /* Boot part */
 
    for(;;) {
        /* Daemon part */
    }
}
首先執行boot 部分,此部分建立檔案系統基本目錄,包括 /dev, /proc, /sys 等。
初始化kmsg log 模組,此模組用於擷取linux kernle log 資訊。

boot部分 最後解析init.rc設定檔,init_parse_config_file("/init.rc");/system/core/rootdir/init.rc
init.rc 文法解釋參考 /system/core/init/readme.txt 

此檔案定義了一系列 action及service。這裡指定了系統啟動時執行哪些動作,可以設定環境變數,
使用linux命令執行某個動作,啟動服務,掛載檔案系統等等。
action 是一個命令的序列,每個action定義了某一命令,action有觸發機制,及在什麼情況下執行此命令。當某一事件與此action的出發機制匹配,此action會被加到action執行隊列中被執行。
parse_service 把解析後的 action 都放到 action_list鏈表,parse_action 把Service放在service_list。

boot部分最後遍曆action_list執行相應命令,具體如下:
(1)console_init_action :初始化console,顯示A N D R O I D 字樣在終端上。
(2)property_init_action
(3)set_init_properties_action
(4)property_service_init_action

Daemon part :
for(;;)不斷執行一下動作:
(1)啟動service_list中指定的服務,所有android其他服務在此處通過service 方式啟動,如虛擬機器,servicemanager,mediaserver等,
每個服務對應init進程的一個子進程。

(2)不斷調用poll 監控3個fd狀態
property_set_fd
signal_recv_fd
keychord_fd
property_set_fd 解釋:
作為一個系統服務管理著系統的配置和狀態,所有的這些系統配置和狀態都是屬性(property)。屬性(property)是一對鍵/值(key/value)組合,鍵和值都是字串類型。Androd中非常多的應用程式和庫直接或者間接的依賴於屬性系統,並由此決定其運行期的行為。例如:adbd進程通過屬性來決定是否當前運行在模擬器中。再比如:java.io.File.pathSeparator方法返回儲存在屬性服務中的值,property_service_init_action 在boot階段調用,初始化android
屬性系統,系統固定的屬性在目錄  "/data/property" 下面。init 進程管理android屬性系統所有資料,其他進程通過android提供的ashmem驅動唯讀屬性系統。
參考:

http://hi.baidu.com/runsheng2005/blog/item/84734fd6ac12363b06088b1f.html

signal_recv_fd :
子進程訊號處理,waitpid等候子進程退出,清理資源,如果子進程是服務則重啟子進程。
keychord_fd:
監控輸入裝置事件並啟動相應服務。

至此,init進程啟動完畢。

上面的daamon部分提到service_list儲存了 init.rc中配置的啟動項,android內給上層提供的一些主要服務都是在此處指定並啟動。

如:servicemanager 
service servicemanager /system/bin/servicemanager
    user system
    critical
    onrestart restart zygote
    onrestart restart media
--------------------#android運行時環境虛擬機器啟動
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
    socket zygote stream 666
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart media
    onrestart restart netd
---------------------------------
service media /system/bin/mediaserver  #多媒體service啟動。
    user media
    group system audio camera graphics inet net_bt net_bt_admin net_raw
    ioprio rt 4
------------------------------------------------------------------------

init進程通過建立子進程啟動其他服務,這些服務作為damon進程在後台運行,給整個android上層應用提供服務。
這裡對應init.rc中的 service 部分,
主要包括以下幾個部分:
(1) servicemanager: start binder system,ipc 通訊機制在此實現,                device/commands/binder.
(2) installd,  install package daemon,  device/servers/installd.
(3) media 多媒體服務,啟動 AudioFlinger, MediaPlayerService and CameraService,device/commands/mediaserver
(4) bluetoothd 藍芽服務
(5) dhcpcd dhcp服務
(6)console , shell,  device/system/bin/ash
(7)adbd, adb daemon進程,device/tools/adbd
(8)mountd,device/system/bin/mountd
(9)flash_recovery, device/commands/recovery/mtdutils
(10)bootsound ,播放預設 boot sound /system/media/audio/ui/boot.mp3. The source is in device/commands/playmp3.
(11)rild, start radio interface layer daemon.  device/commands/rind.

(12)zygote 啟動android  java 運行時環境,同時啟動system server (構建在java虛擬機器之上),此子進程為android 中最重要的服務,device/servers/app

這些子進程構成了android framework基礎。

zygote 進程啟動流程:
Zygote從main(…)@frameworks/base/cmds/app_main.cpp開始。

(1) main(…)@frameworks/base/cmds/app_main.cpp
建立虛擬機器,註冊android本地函數。
建立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。 /java/android/com/android/internal/os/ZygoteInit.java

registerZygoteSocket();//登記Listen連接埠
startSystemServer(); 啟動systemserver子進程,此進程非常重要,他分兩部分,init1,init2,init1階段啟動用C++寫的service, init2啟動了android java 層所有服務。

內部調用forkSystemServer (implemented in device/dalvik/vm/InternalNative.c)啟動新進程,
調用 main#SystemServer.java(/frameworks/base/services/java/com/android/server/systemserver.java), 
內部分兩個過程,init1,init2,init1為jni調用在com_android_server_SystemServer.cpp 中為init1是現代碼。
system_init為init1的具體實現,
進入init2後啟動java線程啟動android java services (framesorks/base/services/java/com/android/server/SystemServer.java)

至此systemservice啟動完畢,進入android。
更進一步分析應該進入 ini1,init2階段啟動的各種服務(SurfaceFlinger,CameraService.,Activity
Manager。。。)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.