標籤:
Android init.rc檔案淺析分類: Android2012-04-13 18:00 13149人閱讀 評論(2) 收藏 舉報androidservicepathactionsocketcommand
目錄(?)[+]
本文主要來自$ANDROID_SOURCE/system/init/readme.txt的翻譯.
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)組成.動作包含一個觸發器,決定了何時執行這個動作。當觸發器的條件滿足時,這個動作會被加入到已被執行的隊列尾。如果此動作在隊列中已經存在,那麼它將不會執行.
一個動作所包含的命令將被依次執行。動作的文法如下所示:
[plain] view plaincopy
- on <trigger>
- <command>
- <command>
- <command>
3.2 服務(services)
服務是指那些需要在系統初始化時就啟動或退出時自動重啟的程式.
它的文法結構如下所示:
[plain] view plaincopy
- service <name> <pathname> [ <argument> ]*
- <option>
- <option>
- ...
3.3 選項(options)
選項是用來修改服務的。它們影響如何及何時運行這個服務.
| 選項 |
描述 |
| critical |
據裝置相關的關鍵服務,如果在4分鐘內,此服務重複啟動了4次,那麼裝置將會重啟進入還原模式。 |
| disabled |
服務不會自動運行,必須顯式地通過伺服器來啟動。 |
| 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,切換組名 |
| 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" |
4 一個 init.conf例子
[plain] view plaincopy
- # not complete -- just providing some examples of usage
- #
- on boot
- export PATH /sbin:/system/sbin:/system/bin
- export LD_LIBRARY_PATH /system/lib
-
- mkdir /dev
- mkdir /proc
- mkdir /sys
-
- mount tmpfs tmpfs /dev
- mkdir /dev/pts
- mkdir /dev/socket
- mount devpts devpts /dev/pts
- mount proc proc /proc
- mount sysfs sysfs /sys
-
- write /proc/cpu/alignment 4
-
- ifup lo
-
- hostname localhost
- domainname localhost
-
- mount yaffs2 [email protected] /system
- mount yaffs2 [email protected] /data
-
- import /system/etc/init.conf
-
- class_start default
-
- service adbd /sbin/adbd
- user adb
- group adb
-
- service usbd /system/bin/usbd -r
- user usbd
- group usbd
- socket usbd 666
-
- service zygote /system/bin/app_process -Xzygote /system/bin --zygote
- socket zygote 666
-
- service runtime /system/bin/runtime
- user system
- group system
-
- on device-added-/dev/compass
- start akmd
-
- on device-removed-/dev/compass
- stop akmd
-
- service akmd /sbin/akmd
- disabled
- user akmd
- group akmd
-
5 調試注意事項
在預設情況下,通過init程式啟動的程式的標準輸出stdout和標準錯誤輸出stderr會重新導向到/dev/null.如:
[plain] view plaincopy
- service akmd /system/bin/logwrapper /sbin/akmd
為了更方便調試你的程式,你可以使用Android的log系統,標準輸出和標準錯誤輸出會重定義到Android的log系統中來.
Android init.rc檔案淺析