Android初始化語言
init.rc 檔案並不是普通的設定檔,而是由一種被稱為“Android初始化語言”(Android Init Language,這裡簡稱為AIL)的指令碼寫成的檔案。
AIL由如下4部分組成:
1. 動作(Actions)
2. 命令(Commands)
3.服務(Services)
4. 選項(Options)
這4部分都是面向行的代碼,也就是說用斷行符號分行符號作為每一條語句的分隔字元。而每一行的代碼由多個符號(Tokens)表示。可以使用反斜線轉義符在 Token中插入空格。雙引號可以將多個由空格分隔的Tokens合成一個Tokens。如果一行寫不下,可以在行尾加上反斜線,來串連下一行。也就是說,可以用反斜線將多行代碼串連成一行代碼。
AIL的注釋與很多Shell指令碼一行,以#開頭。
AIL在編寫時需要分成多個部分(Section),而每一部分的開頭需要指定Actions或Services。也就是說,每一個Actions或 Services確定一個Section。而所有的Commands和Options只能屬於最近定義的Section。如果Commands和 Options在第一個Section之前被定義,它們將被忽略。
Actions和Services的名稱必須唯一。如果有兩個或多個Action或Service擁有同樣的名稱,那麼init在執行它們時將拋出錯誤,並忽略這些Action和Service。
下面來看看Actions、Services、Commands和Options分別應如何設定。
Actions的文法格式如下:
on
也就是說Actions是以關鍵字on開頭的,然後跟一個觸發器,接下來是若干命令。例如,下面就是一個標準的Action。
on boot
ifup lo
hostname localhost
domainname localdomain
其中boot是觸發器,下面三行是command
那麼init.rc到底支援哪些觸發器呢?目前init.rc支援如下5類觸發器。
1. boot
這是init執行後第一個被觸發Trigger,也就是在/init.rc被裝載之後執行該Trigger
2. =
當屬性被設定成時被觸發。例如,
on property:vold.decrypt=trigger_reset_main
class_reset main
3. device-added-
當裝置節點被添加時觸發
4. device-removed-
當裝置節點被移除時添加
5. service-exited-
會在一個特定的服務退出時觸發
Actions後需要跟若干個命令,這些命令如下:
1. exec [ ]*
建立和執行一個程式()。在程式完全執行前,init將會阻塞。由於它不是內建命令,應盡量避免使用exec ,它可能會引起init執行逾時。
2. export
在全域環境中將變數的值設為。(這將會被所有在這命令之後啟動並執行進程所繼承)
3. ifup
啟動網路介面
4. import
指定要解析的其他設定檔。常被用於當前設定檔的擴充
5. hostname
設定主機名稱
6. chdir
改變工作目錄
7. chmod
改變檔案的存取權限
8. chown
變更檔的所有者和組
9. chroot
改變處理根目錄
10. class_start
啟動所有指定服務類下的未運行服務。
11 class_stop
停止指定服務類下的所有已啟動並執行服務。
12. domainname
設定網域名稱
13. insmod
載入指定的驅動模組
14. mkdir [mode][owner] [group]
建立一個目錄,可以選擇性地指定mode、owner以及group。如果沒有指定,預設的許可權為755,並屬於root使用者和 root組。
15. mount
[ ]*
試圖在目錄
掛載指定的裝置。可以是mtd@name的形式指定一個mtd塊裝置。包括 ro、rw、re
16. setkey
保留,暫時未用
17. setprop
將系統屬性的值設為。
18. setrlimit
設定的rlimit (資源限制)
19. start
啟動指定服務(如果此服務還未運行)。
20.stop
停止指定服務(如果此服務在運行中)。
21. symlink
建立一個指向的軟串連。
22. sysclktz
設定系統時鐘基準(0代表時鐘滴答以格林威治平均時(GMT)為準)
23. trigger
觸發一個事件。用於Action排隊
24. wait [ ]
等待一個檔案是否存在,當檔案存在時立即返回,或到指定的逾時時間後返回,如果不指定,預設逾時時間是5秒。
25. write [ ]*
向指定的檔案寫入一個或多個字串。
Services (服務)是一個程式,他在初始化時啟動,並在退出時重啟(可選)。Services (服務)的形式如下:
service [ ]*
例如,下面是一個標準的Service用法
service servicemanager/system/bin/servicemanager
class core
user system
group system
critical
onrestart restartzygote
onrestart restartmedia
onrestart restartsurfaceflinger
onrestart restartdrm
Services的選項是服務的修飾符,可以影響服務如何以及怎樣運行。服務支援的選項如下:
1. critical
表明這是一個非常重要的服務。如果該服務4分鐘內退出大於4次,系統將會重啟並進入 Recovery (恢複)模式。
2. disabled
表明這個服務不會同與他同trigger(觸發器)下的服務自動啟動。該服務必須被明確的按名啟動。
3. setenv
在進程啟動時將環境變數設定為。
4. socket [ [ ] ]
Create a unix domainsocketnamed /dev/socket/ and pass
its fd to thelaunchedprocess. must bedgram,stream or seqpacket.
User and group default to0.
建立一個unix域的名為/dev/socket/的通訊端,並傳遞它的檔案描述符給已啟動的進程。 必須是 dgram,stream 或seqpacket。使用者和組預設是0。
5. user
在啟動這個服務前改變該服務的使用者名稱。此時預設為 root。
6. group [ ]*
在啟動這個服務前改變該服務的組名。除了(必需的)第一個組名,附加的組名通常被用於設定進程的補充組(通過setgroups函數),檔案預設是root。
7. oneshot
服務退出時不重啟。
8. class
指定一個服務類。所有同一類的服務可以同時啟動和停止。如果不通過class選項指定一個類,則預設為default類服務。
9. onrestart
當服務重啟,執行一個命