1. 程式人生 > >android init.rc檔案語法詳解

android init.rc檔案語法詳解


初始化語言包含了四種類型的宣告:
Actions(行動)、 Commands(命令)、Services(服務)和Options(選項)。




基本語法規定
1 所有型別的語句都是基於行的,一個語句包含若干個tokens,token之間通過空格字元分隔. 如果一個token中需要包含空格字元,則需要通過C語言風格的反斜線('\')來轉義,或者使用雙引號把整個token引起來。反斜線還可以出現在一行的末尾,表示下一行的內容仍然屬於當前語句。
2 以'#'開始的行是註釋行。
3 動作(Actions)和服務(Services)語句隱含表示一個新的段落(section)的開始。 所有的命令(commands)和選項(options)歸屬於上方最近的一個段落。在第一個段落之前的指令(commands)和選項(options)是無效的。在服務之後的命令也是無效的。
4 import 語句匯入其他的rc檔案,例如import /init.usb.rc 匯入跟目錄下的init.usb.rc檔案。






動作(Actions)就是在某種條件下觸發一系列的命令,通常有一個trigger,形式如下:
on <trigger>
     <command>
     <command>
trigger主要包括:
boot    當/init.conf載入完畢時觸發
<name>=<value>     當<name>被設定為<value>時觸發,例如on  property:sys.sensors=1表示當環境變數sys.sensors被設定為1的時候觸發。
此外還有early-init init early-boot等等。可以打亂順序隨便寫的,但是解析完了以後的執行順序確實固定的,執行順序如下:early-init -> init -> early-boot -> boot






command 主要包括:
exec <path> [ <argument> ]    執行指定路徑下的程式,並傳遞引數. 
export <name> <value>         設定全域性環境引數,此引數被設定後對所有程序都有效. 
ifup <interface>      使指定的網路介面"上線",相當啟用指定的網路介面 
hostname <name>               設定主機名 
chdir <directory>             改變工作目錄. 
chmod <octal-mode> <path>     改變指定檔案的讀取許可權. 
chown <owner> <group> <path>  改變指定檔案的擁有都和組名的屬性. 
chroot <directory>            改變進行的根目錄. 
class_start <serviceclass>    啟動指定類屬的所有服務,如果服務已經啟動,則不再重複啟動. 
class_stop <serviceclass>     停止指定類屬的所有服務. 
domainname <name>             設定域名 
insmod <path> [ <argument> ]  安裝指定路徑的模組,以及指定引數. 
mkdir <path> [mode] [owner] [group] 用指定引數建立一個目錄,在預設情況下,建立的目錄讀取許可權為755.使用者名稱為root,組名為root. 
mount <type> <device> <dir> [ <mountoption> ]* 類似於linux的mount指令 
setprop <name> <value>       設定屬性及對應的值. 
setrlimit <resource> <cur> <max> 設定資源的rlimit(資源限制),不懂就百度一下rlimit 
start <service>              如果指定的服務未啟動,則啟動它. 例如"start ueventd " ueventd 是服務名,
stop <service>               如果指定的服務當前正在執行,則停止它. 
symlink <target> <path>      建立一個符號連結. 
sysclktz <mins_west_of_gmt>  設定系統基準時間. 
trigger <event>              啟動某個觸發條件,例如trigger firmware_mounts_complete,那麼on  firmware_mounts_complete段的動作將會執行
write <path> <string> [ <string> ] 往指定的檔案寫字串. 






服務(Services)服務是指那些需要在系統初始化時就啟動或退出時自動重啟的在後臺執行的程式.形式如下:
service <name> <pathname> [ <argument> ]
  <option>  
  <option>  
說明name可以隨便定義一個有意義的名字,但是這個名字在rc檔案裡面要是唯一的,如果有重名的,那麼之後的將會忽略掉。
    pathname 該應用程式在系統中的絕對路徑 argument是傳給該應用程式的引數。






options主要包括
critical 據裝置相關的關鍵服務,如果在4分鐘內,此服務重複啟動了4次,那麼裝置將會重啟進入還原模式。 
disabled 該服務不能通過啟動一類服務來啟動,例如 即使該服務有定義option “class core” 也不能用class_start core來啟動,只能以單獨的名字來啟動 start name.
setenv <name> <value> 設定環境變數 
socket <name> <type> <perm> [ <user> [ <group> ] ] 在/dev/socket/下建立一個unix domain的socket,並傳遞建立的檔案描述符fd給服務程序.其中type必須為dgram或stream,seqpacket.使用者名稱和組名預設為0 
user <username> 在執行此服務之前先切換使用者名稱。當前預設為root. 
group <groupname> [ <groupname> ]* 類似於user,切換組名  預設為root
oneshot 當此服務退出時不會自動重啟. 如果沒有這個選項,只執行一次。
class <name> 給服務指定一個類屬,這樣方便操作多個服務同時啟動或停止.預設情況下為default. 
onrestart 當服務重啟時執行一條指令, 例如“onrestart exec /system/bin/myapp”則表示在服務重新啟動的時候執行/system/bin/myapp這個應用。


下面就一個例子如何啟動一個服務
定義一個服務
service Start__server /system/bin/Start__server //定義一個名字叫Start__server 的服務,該服務的路徑在/system/bin/Start__server
    class main                                  //該服務屬於main 的class
    user root
    group root


啟動服務
on boot 
   class_start main      //啟動所有屬於main這個class的服務
如果服務的屬性裡面沒有class的選項,例如                    
service Start__server /system/bin/Start__server                                   
    user root
    group root 
或者定義了disabled 的選項,例如
service Start__server /system/bin/Start__server  
    class main                                   
    user root
    group root
    disabled  
    
那麼啟動服務就需要下面的語句
on boot
   start  Start__server