1 簡述
Android init.rc文件由系統第一個啟動的init程序解析,此文件由語句組成,主要包含了四種類型的語句:Action,Commands,Services,Options.在init.rc文件中一條語句通常是占據一行.單詞之間是通過空格符來相隔的.如果需要在單詞內使用空格,那么得使用轉義字符"\",如果在一行的末尾有一個反斜杠,那么是換行折疊符號,應該和下一行合并成一起來處理,這樣做主要是為了避免一行的字符太長,與C語言中的含義是一致的。注釋是以#號開頭。 Action和services顯式聲明了一個語句塊,而commands和options屬于近聲明的語句塊。在第一個語句塊之前的commands和options會被忽略.
2 關鍵字
token: 計算機語言中的一個單詞,就跟英文中的單詞差不多一人概念.
Section: 語句塊,相當于C語言中大括號內的一個塊。一個Section以Service或On開頭的語句塊.以Service開頭的Section叫做服務,而以On開頭的叫做動作(Action).
services: 服務.
Action: 動作
commands:命令.
options:選項.
trigger:觸發器,或者叫做觸發條件.
class: 類屬,即可以為多個service指定一個相同的類屬,方便操作同時啟動或停止.
3 語句解析
3.1 動作(Action)
動作表示了一組命令(commands)組成.動作包含一個觸發器,決定了何時執行這個動作。當觸發器的條件滿足時,這個動作會被加入到已被執行的隊列尾。如果此動作在隊列中已經存在,那么它將不會執行.
一個動作所包含的命令將被依次執行。動作的語法如下所示:
1. on <trigger>
2. <command>
3. <command>
4. <command>
3.2 服務(services)
服務是指那些需要在系統初始化時就啟動或退出時自動重啟的程序,它的語法結構如下所示:
1. service <name> <pathname> [ <argument> ]*
2. <option>
3. <option>
4. ...
3.3 選項(options)
選項是用來修改服務的。它們影響如何及何時運行這個服務。
選項 |
描述 |
critical |
據設備相關的關鍵服務,如果在4分鐘內,此服務重復啟動了4次,那么設備將會重啟進入還原模式。 |
disabled |
服務不會自動運行,必須顯式地通過服務器來啟動。 |
setenv<name><value> |
設置環境變量 |
socket <name><type><perm> |
在/dev/socket/下創建一個unix domain的socket,并傳遞創建的文件描述符fd給服務進程.其中type必須為dgram或stream,seqpacket.用戶名和組名默認為0 |
user <username> |
在執行此服務之前先切換用戶名。當前默認為root. |
group <groupname> [ <groupname> ]* |
類似于user,切換組名 |
oneshot |
當此服務退出時不會自動重啟. |
class <name> |
給服務指定一個類屬,這樣方便操作多個服務同時啟動或停止.默認情況下為default. |
onrestart |
當服務重啟時執行一條指令, |
3.4 觸發器(trigger)
觸發器用來描述一個觸發條件,當這個觸發條件滿足時可以執行動作。
觸發器 |
描述 |
boot |
當init程序執行,并載入/init.conf文件時觸發. |
<name>=<value> |
當屬性名對應的值設置為指定值時觸發. |
device-added-<path> |
當添加設備時觸發. |
device-removed-<path> |
當設備移除時觸發. |
service-exited-<name> |
當指定的服務退出時觸發. |
3.5 命令(commands)
命令 |
描述 |
exec <path> [ <argument> ]* |
執行指定路徑下的程序,并傳遞參數. |
export <name><value> |
設置全局環境參數,此參數被設置后對所有進程都有效. |
ifup<interface> |
使指定的網絡接口"上線",相當激活指定的網絡接口 |
import <filename> |
導入一個額外的init配置文件. |
hostname <name> |
設置主機名 |
chdir<directory> |
改變工作目錄. |
chmod<octal-mode><path> |
改變指定文件的讀取權限. |
chown<owner><group><path> |
改變指定文件的擁有都和組名的屬性. |
chroot<directory> |
改變進行的根目錄. |
class_start<serviceclass> |
啟動指定類屬的所有服務,如果服務已經啟動,則不再重復啟動. |
class_stop<serviceclass> |
停止指定類屬的所胡服務. |
domainname<name> |
設置域名 |
insmod<path> |
安裝模塊到指定路徑. |
mkdir<path> [mode] [owner] [group] |
用指定參數創建一個目錄,在默認情況下,創建的目錄讀取權限為755.用戶名為root,組名為root. |
mount <type><device><dir> [ <mountoption> ]* |
類似于linux的mount指令 |
setkey |
TBD(To Be Determined),待定. |
setprop<name><value> |
設置屬性及對應的值. |
setrlimit<resource><cur><max> |
設置資源的rlimit(資源限制),不懂就百度一下rlimit |
start <service> |
如果指定的服務未啟動,則啟動它. |
stop <service> |
如果指定的服務當前正在運行,則停止它. |
symlink<target><path> |
創建一個符號鏈接. |
sysclktz<mins_west_of_gmt> |
設置系統基準時間. |
trigger <event> |
Trigger an event. Used to queue an action from another action.這名話沒有理解,望高手指點. |
write <path><string> [ <string> ]* |
往指定的文件寫字符串. |
3.6 屬性(Properties)
init程序在運行時會更新屬性系統的一些屬性,提供程序內部正在執行的信息。
屬性名 |
描述 |
init.action |
當前正在執行的動作,如果沒有則為空字符串"" |
init.command |
當前正在執行的命令.沒有則為空字符串. |
init.svc.<name> |
當前某個服務的狀態,可為"stopped", "running", "restarting" |