標籤:android style blog java c tar
Android 啟動流程: 1.
linux OS Bootloader -> Linux kernel2.
Android/Init Runtime Init Process -> Services -> Zygote/VM -> System Server3.
Framework HomeScreen Server Manager -> Home Luncher如:Android 啟動流程:
1. 系統引導 Bootloader 1). 源碼 bootable/bootloader 2). 上電後,CPU將先執行bootloader 程式,此時有三種情況: a. fastboot 模式即命令或SD卡燒寫入模式,不載入核心及檔案系統,此處可以進行原廠模式的燒寫 b. recovery 模式,載入recovery.img, 它包含有核心及基本的檔案系統,用於工程模式燒寫 c. 正常啟動,載入boot.img, 它包含核心及基本的檔案系統,用於正常啟動手機。 bootloader(組合語言)進行底層初始化,並載入核心代碼,最終跳轉到核心的boot程式。 簡單地說,BootLoader是在作業系統運行之前啟動並執行一段程式,它可以將系統的軟硬體環境帶到一個合適狀態,為運行作業系統做好準備。這樣描述是比較抽象的,但是它的任務確實不多,終極目標就是把OS拉起來運行。
2. 核心Kernel 1)kernel核心初始化(記憶體初始化,開啟中斷,初始化進程表等等);
2)驅動初始化;
3)啟動核心後台(daemons)線程
4)安裝根(root)檔案系統
5) 啟動第一個使用者級進程init kernel 就由bootloader 載入的,源碼:kernel
3.
Init 1) 源碼:system/core/init/*
2) 設定檔:system/rootdir/init.rc
init進程的程式在system/core/init/init.c裡,它是android系統特定的初始化程式, 是一個由核心啟動的使用者級進程,最終它會以後台進程(daemon)的形式一直存在。該進程主要有如下功能: 3)建立/安裝裝置檔案/進程檔案/系統檔案節點; 4)解析啟動/init.rc和/init.<machine_name>.rc;
5)顯示Logo畫面;
6)開啟Device Socket,Property Socket, child進程通訊Socket;
7)執行指令碼中指定的命令或動作,啟動指定服務;如最基本的servicemanamger 及Zygote
8)進入死迴圈:檢查是否有action需要執行;是否需要restart某服務;監聽特定事件(child進程退出,Device相關事件,Property事件,新服務啟動)
4. Native 服務啟動 --servicemanagerServicemanager屬於NativeService。在執行init.rc時就會啟動,與Zygote一樣。在init.rc指令碼中Servicemanager的描述:serviceservicemanager/system/bin/servicemanager
源碼:frameworks/native/cmds/servicemanager/service_manager.c
根據system/core/rootdir/init.rc, init進程通過open_keychord()從service_list(之前從.rc中解析出來的)中把所有service資訊寫入特定檔案,handle_keychord()逐個讀出然後調用service_start()建立(先fork()然後在子進程中調用execve()來執行相應的服務程式)指定的service進程。這裡建立的service都屬於native服務,運行在Linux空間,通過socket向上層提供特定的服務。例如:
console: shell console服務.
servicemanager: Binder服務管理員,管理所有Android系統服務
vold: volume Daemon,支援儲存外設的熱插拔
adbd: Android Debug Bridge Daemon,提供adb相關功能
mountd: 裝置安裝Daemon,負責裝置安裝及狀態通知
debuggerd: Debug Daemon,處理調試進程的請求
rild: 無線介面層(radio interface layer)Daemon.
zygote: 啟動Android Dalvik Runtime並負責進程孵化服務.
mediaserver: 啟動AudioFlinger, MediaPlayerService and CameraService.負責多媒體播放相關的功能,包括音視頻解碼、顯示輸出等。
installd: 包安裝Daemon,提供包安裝/刪除/dex處理等底層功能
5. Zygote重要的背景程式zygote 1) 源碼:frameworks/base/cmds/app_process/app_main.cpp等
2) 說明:zygote是一個在init.rc中被指定啟動的服務,該服務對應的命令是/system/bin/app_process
a) 建立Java Runtime,建立虛擬機器
b) 建立Socket接收ActivityManangerService的請求,用於Fork應用程式
c) 啟動System Server
6.
系統服務system server
1) 源碼:frameworks/base/services/java/com/android/server/SystemServer.java
2) 說明:被zygote啟動,通過System Manager管理android的服務(這裡的服務指frameworks/base/services下的服務,如衛星定位服務,剪下板服務等)
System Server作為Zygote的第1個子進程,是Android Framework的核心,它主要負責Android系統初始化並啟動其他服務。其它的Android服務都由SystemServer啟動並運行在該進程空間
7.
案頭
l
auncher 1) 源碼:ActivityManagerService.java為入口,packages/apps/launcher*實現
2) 說明:系統啟動成功後SystemServer使用xxx.systemReady()通知各個服務,系統已經就緒,傳統型程式Home就是在ActivityManagerService.systemReady()通知的過程中建立的,最終調用 ()啟launcher Android 端啟動過程詳解1. init 進程啟動 a. system/core/rootdir/init.rc b. system/core/init/init.c ,init_parser.c c. init 通過init.c 裡的main ->init_parse_config_file("/init.rc")->parse_config->parse_new_section->parse_service-> 最終將所有service 加入到service_list Ref:http://blog.csdn.net/maxleng/article/details/5508372http://blog.sina.com.cn/s/blog_415bf60a0100wxd9.htmlhttp://wenku.baidu.com/view/42ebf459be23482fb4da4c33