Android系統啟動過程
android 框架的示意圖:
Linux核心啟動之後就到Android Init程序,進而啟動Android相關的服務和應用
啟動的過程如下圖所示:
一 Init程序的啟動
init程序,它是一個由核心啟動的使用者級程序。核心自行啟動(已經被載入記憶體,開始執行,
並已初始化所有的裝置驅動程式和資料結構等)之後,就通過啟動一個使用者級程式init的方式,完成引導程序。init始終是第一個程序。
啟動過程就是程式碼init.c中main函式執行過程:system\core\init\init.c
在函式中執行了:資料夾建立,掛載,rc檔案解析,屬性設定,啟動服務,執行動作,socket監聽……
下面看兩個重要的過程:rc檔案解析和服務啟動。
1 rc檔案解析
.rc檔案是Android使用的初始化指令碼檔案 (System/Core/Init/readme.txt中有描述:
four broad classes of statements which are Actions, Commands, Services, and Options.)
其中Command 就是系統支援的一系列命令,如:export,hostname,mkdir,mount,等等,其中一部分是 linux 命令,
還有一些是 android 新增的,如:class_start <serviceclass>: 啟動服務,class_stop <serviceclass>:關閉服務,等等。
其中Options是針對 Service 的選項的。
系統初始化要觸發的動作和要啟動的服務及其各自屬性都在rc指令碼檔案中定義。 具體看一下啟動指令碼:\system\core\rootdir\init.rc
在解析rc指令碼檔案時,將相應的型別放入各自的List中:
\system\core\init\Init_parser.c :init_parse_config_file( )存入到
action_queue、 action_list、 service_list中,解析過程可以看一下parse_config函式,類似狀態機形式挺有意思。
這其中包含了服務:adbd、servicemanager、vold、ril-daemon、debuggerd、surfaceflinger、zygote、media……
2 服務啟動
檔案解析完成之後將service放入到service_list中。
檔案解析完成之後將service放入到service_list中。
\system\core\init\builtins.c
Service的啟動是在do_class_start函式中完成:
int do_class_start(int nargs, char **args)
{
service_for_each_class(args[1], service_start_if_not_disabled);
return 0;
}
遍歷所有名稱為classname,狀態不為SVC_DISABLED的Service啟動
void service_for_each_class(const char *classname,
void (*func)(struct service *svc))
{
……
}
static void service_start_if_not_disabled(struct service *svc)
{
if (!(svc->flags & SVC_DISABLED)) {
service_start(svc, NULL);
}
}
do_class_start對應的命令:
KEYWORD(class_start, COMMAND, 1, do_class_start)
init.rc檔案中搜索class_start:class_start main 、class_start core、……
main、core即為do_class_start引數classname
init.rc檔案中Service class名稱都是main:
service drm /system/bin/drmserver
class main
service surfaceflinger /system/bin/surfaceflinger
class main
於是就能夠通過main名稱遍歷到所有的Service,將其啟動。
do_class_start呼叫:
init.rc中
on boot //action
class_start core //執行command 對應 do_class_start
class_start main
Init程序main函式中:
system/core/init/init.c中:
int main(){
//掛在檔案
//解析配置檔案:init.rc……
//初始化化action queue
……
for(;;){
execute_one_command();
restart_processes();
for (i = 0; i < fd_count; i++) {
if (ufds[i].revents == POLLIN) {
if (ufds[i].fd == get_property_set_fd())
handle_property_set_fd();
else if (ufds[i].fd == get_keychord_fd())
handle_keychord();
else if (ufds[i].fd == get_signal_fd())
handle_signal();
}
}
}
}
迴圈呼叫service_start,將狀態SVC_RESTARTING啟動, 將啟動後的service狀態設定為SVC_RUNNING。
pid=fork();
execve();
在訊息迴圈中:Init程序執行了Android的Command,啟動了Android的NativeService,監聽Service的變化需求,Signal處理。
Init程序是作為屬性服務(Property service),維護這些NativeService。
二 ServiceManager啟動
在.rc指令碼檔案中zygote的描述:
service servicemanager /system/bin/servicemanager
class core
user system
group system
critical
onrestart restart zygote
onrestart restart media
onrestart restart surfaceflinger
onrestart restart drm
ServiceManager用來管理系統中所有的binder service,不管是本地的c++實現的還是java語言實現的都需要
這個程序來統一管理,最主要的管理就是,註冊新增服務,獲取服務。所有的Service使用前都必須先在servicemanager中進行註冊。
do_find_service( )
do_add_service( )
svcmgr_handler( )
程式碼位置:frameworks\base\cmds\servicemanager\Service_manager.c
三 Zygote程序的啟動
Zygote這個程序是非常重要的一個程序,Zygote程序的建立是真正的Android執行空間,初始化建立的Service都是Navtive service.
(1) 在.rc指令碼檔案中zygote的描述:
相關推薦
Android系統啟動過程-uBoot+Kernel+Android
轉載自:http://www.cnblogs.com/pngcui/p/4665106.html 摘要:本文是參考大量網上資源在結合自己檢視原始碼總結出來的,讓自己同時也讓大家加深對Android系統啟動過程有一個更加深入的瞭解!再次強調,本文的大多數功勞應
Android系統啟動過程
android 框架的示意圖: Linux核心啟動之後就到Android Init程序,進而啟動Android相關的服務和應用 啟動的過程如下圖所示: 一 Init程序的啟動 init程序,它是一個由核心啟動的使
Android系統啟動過程學習
使用 android 手機已經長時間了,同時,從大學學習 android 開發開始,也進行過多款 android app 專案的開發,但是對 android 內部的啟動過程,即當我們從按下電源鍵開機開始, android 系統內部是如何執行的,由於android
Android系統啟動過程分析
Android系統啟動過程分析 一、Android平臺架構 首先貼一張Android系統架構圖方便理解整個Android架構,這可以讓我們從整體上對整個啟動流程有個大概認知。 可以看出整個架構由5部分構成,從下到上分別為: 1. Linux核心層 Android 的核心繫統服務基於Linux 核心,在此基
Android系統啟動流程(一)解析init進程啟動過程
option 寫入 android change failed miss 通知 target sna 前言 作為“Android框架層”這個大系列中的第一個系列,我們首先要了解的是Android系統啟動流程,在這個流程中會涉及到很多重要的知識點,這個系列我們就來一一講解它們
Android系統啟動流程(一)解析init程序啟動過程
前言 作為“Android框架層”這個大系列中的第一個系列,我們首先要了解的是Android系統啟動流程,在這個流程中會涉及到很多重要的知識點,這個系列我們就來一一講解它們,這一篇我們就來學習init程序。 1.init簡介 init程序是An
android原始碼4.4.2----系統啟動過程分析
public class SystemServer { private static final String TAG = "SystemServer"; public static final int FACTORY_TEST_OFF = 0; public static final int F
Android系統啟動流程(二)解析Zygote程序啟動過程
前言 上一篇文章我們分析了init程序的啟動過程,啟動過程中主要做了三件事,其中一件就是建立了Zygote程序,那麼Zygote程序是什麼,它做了哪些事呢?這篇文章會給你這些問題的答案。 1.Zygote簡介 在Android系統中,DVM(D
Linux啟動流程-bootloader至kernel的過程--android系統啟動流程
1 Bootloader 對於一般的ARM處理器,CPU上電或復位執行第一條指令所在地址,即第一段程式Bootloader的開始地址,Bootloader一般存於Nor-flash(XIP),支援晶片內執行。 Bootloader的功能可總結為:1)初始化CPU時鐘,記憶體
Android系統啟動流程——解析init程序啟動過程
最近主要是在看android關機充電流程,對android啟動有些迷惑,結合網上部落格專家的文章,加一些自己的理解。 1.init簡介 init程序是Android系統中使用者空間的第一個程序,作為第一個程序,它被賦予了很多極其重要的工作職責,比如建立zygote(孵化器
Android原始碼學習之八—系統啟動過程
Android原始碼數量龐大,雖然對它的學習從未停止,但是整理成這樣的文字,實在是費時費力的一件事情,不過好在前文已經對其基本機制加以分析,相信以此為基礎,其他的內容學習起來就沒那麼困難了。 今天是20
Android系統啟動流程(四)Launcher啟動過程與系統啟動流程
相關文章 Android系統架構與系統原始碼目錄 Android系統啟動流程(一)解析init程序啟動過程 Android系統啟動流程(二)解析Zygote程序啟動過程 Android系統啟動流程(三)解析SyetemServer程序啟動過程 前言
Android系統啟動流程(三)解析SyetemServer程序啟動過程
相關文章 Android系統架構與系統原始碼目錄 Android系統啟動流程(一)解析init程序啟動過程 Android系統啟動流程(二)解析Zygote程序啟動過程 前言 上一篇我們學習了Zygote程序,並且知道Zygote程序啟動了SyetemServ
Android編譯過程總結及android中各種img檔案的作用以及系統啟動過程
編譯環境:ubuntu 10.04(或者更高)(windows平臺目前不被支援) 本文以編譯android2.3為例,64位作業系統 1、編譯環境的準備 (1)確保安裝有ubuntu系統或者虛擬機器 (2)安裝JDK1.6(對於Android2.3以上程式碼) $ sud
Android 的 ramdisk.img、system.img、userdata.img 作用說明,以及UBoot 系統啟動過程
一個分割槽影像檔案,它會在kernel 啟動的時候,以只讀的方式被 mount , 這個檔案中只是包含了 /init 以及一些配置檔案,這個ramdisk 被用來呼叫init,以及把真正的root file system mount 起來。 #其實ramdisk.img的內容就是/out/target/pro
linux系統啟動過程具體解釋-開機加電後發生了什麽 --linux內核剖析(零)
界面 種類 system pos 放置 nlog 提示 mar .com 本文參考了例如以下文章 深入理解linux啟動過程 mbr (主引導記錄(Master Boot Record)) 電腦從開機加電到操作系統main函數之前執行的過程
為什麽要有uboot?帶你全面分析嵌入式linux系統啟動過程中uboot的作用
統一 一次 fail 進入 是我 臺式機 平板 配置 webp 1.為什麽要有uboot 1.1、計算機系統的主要部件 (1)計算機系統就是以CPU為核心來運行的系統。典型的計算機系統有:PC機(臺式機+筆記本)、嵌入式設備(手機、平板電腦、遊戲機)、單片機(家用電器像
linux 系統啟動過程分析
系統root 密碼丟失故障 linux啟動順序主板BIOS加電自檢 檢查硬件--> 讀取硬盤引導扇區(MBR)--> 啟動引導程序(grub)--> 選擇系統--> 加載系統內核(kernel shell)--> 啟動系統讀取相應的默認設置(環境變量,運行級別)--
linux系統啟動過程
字符 tty 我們 變量 默認 終端 .... 用戶 關聯 初始化進程 會根據字符終端設備,打開getty程序,並關聯在字符終端設備上tty0上 getty打開login 進程 login會讀取用戶信息,查詢出登陸shell 登陸成功,啟動shell,開始讀取shell啟動
linux學習-Linux系統啟動過程
linux 關機 mage 模式 服務 關機 win sin class windows系統 linux系統啟動過程 Linux系統的啟動過程並不是大家想象中的那麽復雜,其過程可以分為5個階段: 內核的引導。 運行init。 系統初始化。 建立終端 。 用戶登錄系統。