Android Init Language(安卓初始化語言)

android源碼學(xué)習(xí)目錄

了解Android init進程的都知道,啟動 init進程之前會解析init.rc文件,init.rc是Android的配置文件腳本,它由一種被稱為"Android初始化語言"--Android init Language 編寫。

1. android init language(簡稱 AIL)組成

  1. 動作--(Actions)
  2. 命令--(Commands)
  3. 服務(wù)--(Services)
  4. 選項--(Options)

2. 語法特性

  • AIL是面向行的代碼,也就是每一行是一條語句,回車就是分隔符,一個語句包含若干個tokens, token之間需要有空格分割符,如果token中有空格需要通過c語言風格的反斜杠('\')來轉(zhuǎn)義,或者使用雙引號將整個token包裹起來。反斜杠出現(xiàn)在末尾表示下一行任屬于當前語句。
  • 以#開始的行為注釋,
  • AIL編寫分成多個(Section), 每個部分的開頭需要指定Actions或Services,也就是每個Actions和Services都是一個Section,所有的Commands和Options只能屬于定義的這個Section,
  • Actions和Services的名稱必須唯一,如果多個一樣的名字,后面聲明的將被忽略為一個錯誤。

3. Actions

Actions是被命名的命令(command)序列,由觸發(fā)器來決定這個actions什么時候發(fā)生,當一個時間觸發(fā)了一個符合的action觸發(fā)器,這個action就會被添加到處理隊列尾部(它已經(jīng)存在在對列除外)。

在處理隊列中沒一個action都按照排序出列,action中的command也按照順序執(zhí)行,

Actions的結(jié)構(gòu)

on <trigger>

? <command>

? <command>

? <command>

如上:Actions以關(guān)鍵字 on 開頭,然后跟一個觸發(fā)器,接下來是若干命令。

觸發(fā)器

觸發(fā)器是一個字符串,用于匹配特定的事件,

#這個是boot觸發(fā)器, 下面三行是command
on boot
    ifup lo
    hostname localhost
    domainname localdomain

4.Services

服務(wù)是初始化程序init需要啟動的一些程序,初始化程序可能在這些程序退出后重啟他們

Services的形式

service <name> <pathname> [ <argument> ] *

? <option>

? <option>

5.Options

選項屬于服務(wù),它將影響初始化程序運行服務(wù)的時機和方法??赡艿倪x項如下

選項 說明
disabled 此服務(wù)不會自動從其類啟動。它必須按名稱顯式啟動。
socket <name><type> <perm> [ <user> [ <group> ] ] 創(chuàng)建一個名為/dev/socket/<name>的unix域套接字,并將其fd傳遞給啟動的進程。有效的<type>值包括dgram和stream。用戶和組默認為0。
user <username> 在執(zhí)行此服務(wù)之前更改為用戶名。當前默認為root
group <groupname> [ <groupname> ]* 在執(zhí)行此服務(wù)之前更改為groupname。第一個組之外的其他組名(這是必需的)用于設(shè)置進程的其他組(使用set groups())。當前默認為root
capability [ <capability> ]+ 在執(zhí)行此服務(wù)之前設(shè)置linux功能
class <name> 指定服務(wù)的類名。命名類中的所有服務(wù)必須一起啟動和停止。如果服務(wù)不是通過類選項指定的,則將其視為類“默認”。
oneshot 退出時不要重新啟動服務(wù)。

6.觸發(fā)器

上文中介紹過觸發(fā)器,這里列舉init.rc有的幾個

觸發(fā)器 功能
boot 這是init啟動時(加載/init.conf之后)發(fā)生的第一個觸發(fā)器。
<name>=<value> 當屬性<name>設(shè)置為特定值<value>時,會觸發(fā)此觸發(fā)器
device-added-<path>
device-removed-<path>
當添加或刪除設(shè)備節(jié)點時,會觸發(fā)這些觸發(fā)器。
service-exited-<name> 當指定服務(wù)退出時,將觸發(fā)這些觸發(fā)器。

7.指令--Commands

command是Actions的一部分,用于執(zhí)行一條命名

command 說明
exec <path> [ <argument> ]* 創(chuàng)建并執(zhí)行程序(<path>)。這將阻塞直到程序完成執(zhí)行。盡量避免執(zhí)行。與內(nèi)置命令不同的是,它會冒著讓init“卡住”的風險。
export <name> <value> 將全局環(huán)境中的環(huán)境變量<name>設(shè)置為<value>(執(zhí)行此命令后啟動的所有進程都將繼承該變量)。
ifup <interface> 使網(wǎng)絡(luò)接口<interface>在線。
import <filename> 解析init配置文件,擴展當前配置。導(dǎo)入文件
hostname <name> Set the host name.
class_start <serviceclass> 如果指定類的所有服務(wù)尚未運行,請啟動它們。
class_stop <serviceclass> 如果指定類的所有服務(wù)當前正在運行,請停止這些服務(wù)。
domainname <name> 設(shè)置域名。
insmod <path> 下載模塊到path
mkdir <path> Make a directory at <path>.
mount <type> <device> <dir> [ <mountoption> ]* 嘗試在目錄<dir><device>中掛載已命名設(shè)備。它的格式可以是mtd@name,以便按名稱指定mtd塊設(shè)備。
setkey -當前未定義-
setprop <name> <value> 將系統(tǒng)屬性<name>設(shè)置為<value>。
setrlimit <resource> <cur> <max> 為資源設(shè)置一個限制。
start <service> Start a service running if it is not already running.
symlink <target> <path> 用<target>在<path>處創(chuàng)建link。
write <path> <string> [ <string> ]* 打開path處文件,并使用write(2)向文件寫入一個或多個字符

8.配置屬性

初始化程序(Init)可以根據(jù)需要修改一些系統(tǒng)的屬性。

屬性 說明
init.action 等于當前正在執(zhí)行的操作的名稱,如果沒有,則為“”
init.command 等于正在執(zhí)行的命令,如果沒有,則為“”
init.svc.<name> 服務(wù)的狀態(tài)("stopped", "running", or "restarting").
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容