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

