概述
Android Init 語言由四大類語句組成,它們是 Actions、Commands、Services 和 Options。
所有這些都是面向行的,由空格分隔的標(biāo)記組成。 c 樣式的反斜杠轉(zhuǎn)義可用于將空格插入到標(biāo)記中。 雙引號也可用于防止空格將文本分成多個標(biāo)記。 反斜杠,當(dāng)它是一行的最后一個字符時,可以用于換行。
以 # 開頭的行(允許前導(dǎo)空格)是注釋。
Actions 和 Services 隱式聲明了一個新部分。 所有Commands或Options都屬于最近聲明的部分。 第一部分之前的Commands或Options將被忽略。
Actions 和Services 具有唯一的名稱。 如果第二個 Action 或 Service 被聲明為與現(xiàn)有的同名,則將其作為錯誤忽略。 (???我們應(yīng)該覆蓋而不是)
Actions
Actions 是命名的命令序列。 Actions 有一個觸發(fā)器,用于確定動作何時發(fā)生。 當(dāng)發(fā)生與Actions 的觸發(fā)器匹配的事件時,該Actions 將添加到待執(zhí)行隊列的尾部(除非它已經(jīng)在隊列中)。
隊列中的每個 action 都按順序出隊,并且該動作中的每個命令都按順序執(zhí)行。 Init 在活動中的命令執(zhí)行“之間”處理其他活動(設(shè)備創(chuàng)建/銷毀、屬性設(shè)置、進(jìn)程重 啟)。
命令采取以下形式:
on <trigger>
<command>
<command>
<command>
Services
服務(wù)是在它們退出時啟動并(可選)重新啟動的程序。
服務(wù)采取以下形式:
service <name> <pathname> [ <argument> ]*
<option>
<option>
...
Options
選項是服務(wù)的調(diào)節(jié)器。他們影響init進(jìn)程如何并且何時運行這個服務(wù)。
critical
這是一個設(shè)備關(guān)鍵服務(wù)。如果他在四分鐘內(nèi)存在超過四次,設(shè)備將會重啟進(jìn)入恢復(fù)模式。
disabled
這個服務(wù)將不能與他的類自動啟動。他必須通過名稱被顯示啟動。
setenv <名稱> <值>
在啟動進(jìn)程中設(shè)置環(huán)境變量<名稱>到<數(shù)值>
socket <name> <type> <perm> [ <user> [ <group> [ <seclabel> ] ] ]
創(chuàng)建一個unix域套接字,命名為 /dev/socket/<name>,并且傳遞他的文件描述符fd到啟動進(jìn)程中。
<type>必須是"dgram","stream"或者是"seqpacket"。
User和group默認(rèn)為0。
'seclabel'是這個套接字的SELinux安全上下文。
他默認(rèn)為服務(wù)安全上下文,由seclabel指定或者是基于服務(wù)可執(zhí)行文件安全上下文計算得來。
user <username>
在運行這個服務(wù)之前改為username(用戶名稱)。
當(dāng)前默認(rèn)為root.目前,如果你的進(jìn)程需要linux功能,那么你不能使用這個命令。你必須在進(jìn)程中
請求功能但依然root,然后降級到你期望的uid。
group <groupname> [ <groupname> ]*
在運行這個服務(wù)之前修改為groupname。在第一個之前的組名稱被用來設(shè)置進(jìn)程的追加的組(通過setgrooups())
。目前默認(rèn)為root。
seclabel <seclabel>
在執(zhí)行這個服務(wù)之前改為seclabel。主要是從rootfs等中被services使用。
位于系統(tǒng)分區(qū)的services可以基于他們的文件安全上下文使用策略定義的轉(zhuǎn)換。
如果未被指定或者是在策略中沒有轉(zhuǎn)換被定義,默認(rèn)為初始化上下文。
oneshot
當(dāng)他退出的時候不要重啟服務(wù)。
class <name>
為服務(wù)指定一個類名稱。位于一個命名的類中的所有服務(wù)一起被啟動或停止。
如果服務(wù)未被class選項指定,則該服務(wù)位于類'default'中。
onrestart
當(dāng)services重啟的時候運行一個命令。
writepid <file...>
當(dāng)子進(jìn)程被創(chuàng)建的時候,將子進(jìn)程的pid寫入到給定的文件中。意味著cgroup/cpuset
用法。
觸發(fā)器
觸發(fā)器是可用于匹配某些類型的字符串
事件并用于導(dǎo)致動作發(fā)生。
boot
這是 init 啟動時將發(fā)生的第一個觸發(fā)器
(在 /init.conf 加載后)
<name>=<value>
設(shè)置屬性 <name> 時會發(fā)生這種形式的觸發(fā)器
到特定值 <value>。
device-added-<path>
device-removed-<path></pre>
添加設(shè)備節(jié)點時會發(fā)生這些形式的觸發(fā)器
或刪除。
service-exited-<name>
這種形式的觸發(fā)器在指定的服務(wù)退出時發(fā)生。
示例:
on boot
# basic network init
ifup lo
hostname localhost
domainname localdomain
# set RLIMIT_NICE to allow priorities from 19 to -20
setrlimit 13 40 40
# Define the oom_adj values for the classes of processes that can be
# killed by the kernel. These are used in ActivityManagerService.
setprop ro.FOREGROUND_APP_ADJ 0
setprop ro.VISIBLE_APP_ADJ 1
...
命令
exec <path> [ <argument> ]*
fork 并執(zhí)行一個程序 (<path>)。這將阻塞直到
程序完成執(zhí)行。最好避免執(zhí)行
與內(nèi)置命令不同,它冒著獲取的風(fēng)險
初始化“卡住”。 (???也許應(yīng)該有一個超時?)
export <name> <value>
將環(huán)境變量 <name> 設(shè)置為等于 <value> 在
全局環(huán)境(將被所有進(jìn)程繼承
此命令執(zhí)行后啟動)
ifup <interface>
使網(wǎng)絡(luò)接口 <interface> 聯(lián)機。
import <filename>
解析一個初始化配置文件,擴(kuò)展當(dāng)前配置。
hostname <name>
設(shè)置主機名。
chdir <directory>
更改工作目錄。
chmod <octal-mode> <path>
更改文件訪問權(quán)限。
chown <owner> <group> <path>
更改文件所有者和組。
chroot <directory>
更改進(jìn)程根目錄。
class_start <serviceclass>
啟動指定類的所有服務(wù),如果它們是
尚未運行。
class_stop <serviceclass>
停止指定類的所有服務(wù),如果它們是
目前正在運行。
domainname <name>
設(shè)置域名。
insmod <path>
將模塊安裝在 <path>
mkdir <path> [mode] [owner] [group]
在 <path> 處創(chuàng)建一個目錄,可選擇使用給定的模式、所有者和
團(tuán)體。如果未提供,則使用權(quán)限 755 和
由 root 用戶和 root 組擁有。
mount <type> <device> <dir> [ <mountoption> ]*
嘗試將命名設(shè)備掛載到目錄 <dir>
<device> 可以是 mtd@name 的形式來指定一個 mtd 塊
設(shè)備名稱。
<mountoption>s 包括 "ro", "rw", "remount", "noatime", ...
restorecon <path>
將 <path> 命名的文件恢復(fù)到指定的安全上下文
在 file_contexts 配置中。
init.rc 創(chuàng)建的目錄不需要,因為這些是
由 init 自動正確標(biāo)記。
setcon <securitycontext>
將當(dāng)前進(jìn)程安全上下文設(shè)置為指定的字符串。
這通常僅在 early-init 中用于設(shè)置初始化上下文
在任何其他進(jìn)程開始之前。
setenforce 0|1
設(shè)置 SELinux 系統(tǒng)范圍的強制執(zhí)行狀態(tài)。
0 是允許的(即記錄但不拒絕),1 是強制的。
setkey
待定
setprop <name> <value>
將系統(tǒng)屬性 <name> 設(shè)置為 <value>。
setrlimit <resource> <cur> <max>
設(shè)置資源的 rlimit。
setsebool <name> <value>
將 SELinux 布爾 <name> 設(shè)置為 <value>。
<value> 可以是 1|true|on 或 0|false|off
start <service>
如果服務(wù)尚未運行,則啟動該服務(wù)。
stop <service>
如果服務(wù)當(dāng)前正在運行,則停止它的運行。
symlink <target> <path>
在 <path> 處創(chuàng)建一個符號鏈接,其值為 <target>
sysclktz <mins_west_of_gmt>
設(shè)置系統(tǒng)時鐘基準(zhǔn)(如果系統(tǒng)時鐘在 GMT 計時,則為 0)
trigger <event>
觸發(fā)事件。用于將另一個動作排隊
行動。
wait <path> [ <timeout> ]
輪詢給定文件的存在并在找到時返回,
或已達(dá)到超時。如果未指定超時,則
當(dāng)前默認(rèn)為五秒。
write <path> <string> [ <string> ]*
在 <path> 打開文件并寫入一個或多個字符串
用 write(2)