天天看點

Android啟動流程---init一、概述二、信号處理三、rc檔案文法四、啟動服務

一、概述

init是Linux系統中使用者空間的第一個程序,程序号為1。Kernel啟動後,在使用者空間,啟動init程序,并調用init中的main()方法執行init程序的職責。對于init程序的功能分為4部分:

分析和運作所有的init.rc檔案;

生成裝置驅動節點; (通過rc檔案建立)

處理子程序的終止(signal方式);

提供屬性服務。

1. main方法

Android啟動流程---init一、概述二、信号處理三、rc檔案文法四、啟動服務

2. console_init_action

開機顯示的底部帶ANDROID字樣的畫面

Android啟動流程---init一、概述二、信号處理三、rc檔案文法四、啟動服務

二、信号處理

在init.cpp的main()方法中,通過signal_handler_init()來初始化信号處理過程。

主要工作:

初始化signal句柄;

循環處理子程序;

注冊epoll句柄;

處理子程序的終止;

1. signal_handler_init

Android啟動流程---init一、概述二、信号處理三、rc檔案文法四、啟動服務

每個程序在處理其他程序發送的signal信号時都需要先注冊,當程序的運作狀态改變或終止時會産生某種signal信号,init程序是所有使用者空間程序的父程序,當其子程序終止時産生SIGCHLD信号,init程序調用信号安裝函數sigaction(),傳遞參數給sigaction結構體,便完成信号處理的過程。

SIGCHLD_handler和handle_signal,如下:

Android啟動流程---init一、概述二、信号處理三、rc檔案文法四、啟動服務

三、rc檔案文法

rc檔案文法是以行尾機關,以空格間隔的文法,以#開始代表注釋行。rc檔案主要包含Action、Service、Command、Options,其中對于Action和Service的名稱都是唯一的,對于重複的命名視為無效。

1. Action

Action: 通過trigger,即以 on開頭的語句,決定何時執行相應的service。

2. Service

服務Service,以 service開頭,由init程序啟動,一般運作于另外一個init的子程序,是以啟動service前需要判斷對應的可執行檔案是否存在。init生成的子程序,定義在rc檔案,其中每一個service,在啟動時會通過fork方式生成子程序。

3.Command

class_start : 啟動屬于同一個class的所有服務;

start : 啟動指定的服務,若已啟動則跳過;

stop : 停止正在運作的服務

setprop :設定屬性值

mkdir :建立指定目錄

symlink : 建立連接配接到的符号連結;

write : 向檔案path中寫入字元串;

exec: fork并執行,會阻塞init程序直到程式完畢;

exprot :設定環境變量;

loglevel :設定log級别

四、啟動服務

1. 服務啟動(Zygote)

Android啟動流程---init一、概述二、信号處理三、rc檔案文法四、啟動服務

通過init_parser.cpp完成整個service解析工作,此處就不詳細展開講解析過程,該過程主要是建立一個名”zygote”的service結構體,一個socketinfo結構體(用于socket通信),以及一個包含6個onrestart的action和1個writepid的結構體。

Zygote服務會随着main class的啟動而啟動,退出後會由init重新開機zygote

Android啟動流程---init一、概述二、信号處理三、rc檔案文法四、啟動服務