Android 的 init.rc 文件简介【转】
轉自:http://blog.csdn.net/yimiyangguang1314/article/details/6268177
init.rc由許多的Action和Service組成。每一個語句占據一行,并且各個關鍵字被空格分開.
由 # (前面允許有空格)開始的行都是注釋行(comment)
一個actions 或 services 的開始隱含聲明了一個新的段,所有commands 或 options 屬于最近的聲明。在第一個段之前的 commands 或 options 都會被忽略
每一個actions 和 services 都有不同的名字。后面與前面發生重名的,那么這個后面重名的將被忽略或被認為是一個錯誤。
actions其實就是一組被命名的命令序列。actions 都有一個觸發條件,觸發條件決定了action何時執行。當一個事件發生如果匹配action的觸發條件,那么這個action將會被添加到預備執行隊列的尾部(除非它已經在隊列當中)?
每一個action中的命令將被順序執行。init進程負責在其它activities(如:設備創建/銷毀,屬性設置,進程重啟)之間執行這些命令序列。
每一個action格式如下:
on <trigger>
<command>
<command>
? ...
trigger是一個action觸發的條件,一共有如下幾種:
1、boot
發生在init啟動時,/init.conf被加載以后。
2、<name>=<value>
發生在名字為<name>的屬性的值被設置為<value>時。
3、device-added-<path>/device-removed-<path>
當一個device node被添加/刪除時。
4、service-exited-<name>當某個服務退出時。
?
command一共有如下幾種:
1、exec <path> [<argument>]*
fork并execute一個路徑<path>下面的程序,直到程序執行完畢后,init才會繼續前進。盡量避免使用這個command,它有可能導致init阻塞。其它command不存在這個問題。
2、export <name> <value>
把全局環境變量<name>的值設置為<value>。這個命令執行完畢以后啟動的所有進程都會繼承這個全局變量。
3、ifup <interface>
Bring the network interface <interface> online.(打開某個網卡)
4、import <filename>
Parse an init config file, extending the current configuration.
5、hostname <name>
Set the host name.
6、class_start <serviceclass>
如果某一類service沒有運行,啟動它們。
7、class_stop <serviceclass>
如果某一類service正在運行,停止它們。
8、domainname <name>
Set the domain name.
9、insmod <path>
安裝路徑<path>指定的模塊。
10、mkdir <path>
創建<path>代表的文件夾,只能一層層地創建。
11、mount <type> <device> <dir> [ <mountoption> ]*
把<device>掛載到系統類型為<type>的文件系統的<dir>目錄下。<device>可能有mtd@name的形式,代表名字為name的mtd塊設備。
12、setkey
未定義
13、setprop <name> <value>
設置系統屬性。
14、setrlimit <resource> <cur> <max>
Set the rlimit for a resource.
15、start <service>
如果服務沒有運行,啟動它。
16、stop <service>
如果服務正在運行,停止它。
17、symlink <target> <path>
把<target>鏈接到目錄<path>下。
18、write <path> <string> [ <string> ]*
打開<path>所指的文件,并把<string>寫入。
關于3、5、8,參見init.rc里面的
on boot
# basic network init
?? ?ifup lo
?? ?hostname localhost
?? ?domainname localdomain
關于14,參見init.rc里面的
# set RLIMIT_NICE to allow priorities from 19 to -20
?? ?setrlimit 13 40 40
?
?
說完了action下來我們來說說service
?
services 是一些由init 啟動 和 重新(如果有需要)啟動的程序,當然這些程序如果是存在的。
每一個service格式如下:
service <name> <pathname> [ <argument> ]*
<option>
<option>
? ...
例如:
1
?service ppp /system/bin/pppd call gprs
???? user root
???? group system radio
???? disabled
???? oneshot
2
service mtpd /system/bin/mtpd
??? socket mtpd stream 600 system system
??? user vpn
??? group vpn net_admin net_raw
??? disabled
??? oneshot
options 是service的修飾符,用來告訴init 怎樣及何時啟動service。一共有如下幾種:
1、disableds
這個服務不能通過啟動一類服務來啟動,只能單獨以名字來啟動。
?
2、socket <type> <name> <perm>? <user> <group>?
創建一個名字為/dev/socket/<name>的unix domain socket,并把它的fd傳遞給 加載的進程。<type>的值是dgram或stream.
?
注意:在init.rc中使用socket時,<type>是放在<name>之后的。
init程序在運行過程中可能會設置幾個特殊屬性的值,來告訴其它程序它正在做什么。這些屬性是:
(1)、init.action
當前正在執行的action的名字,如果沒有,就是“”。
(2)、init.command
當前正在執行的command的名字,如果沒有,就是“”。
(3)、init.svc.<name>
一個服務的狀態。可能的值有:“stopped”,"running","restarting"
?
3、user <username>
在啟動服務之前,把用戶名切換到<username>。默認是root
4、group <groupname> [ <groupname> ]*
在啟動服務之前,把組名切換到<groupname>。一個服務可能屬于多個組。
5、capability [ <capability> ]+
Set linux capability before exec'ing this service
6、oneshot
服務之運行一次,退出后不再重啟。
7、class <name>
為服務設定一個類別,一個類別是中的服務可以同時啟動或停止。如果沒有這個屬性,服務的默認類別是“default”
默認情況下,通過init啟動的程序都會把stdout和stderr定向到/dev/null。有時為了調試方便,可以通過Android的logwrapper程序啟動某個程序。這樣,被啟動程序stdout和stderr就被定向到了Android的LOG系統中,可以通過logcat來查看了。
例如:
service akmd /system/bin/logwraper /sbin/akmd
轉載:CSDN? 網友?http://blog.csdn.net/a345017062/archive/2011/03/11/6239204.aspx,這篇博客,自己進行了部分修改,對于Android的軟件研發人員,很有必要研究一下。?
總結
以上是生活随笔為你收集整理的Android 的 init.rc 文件简介【转】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hibernate笔记--缓存机制之 一
- 下一篇: Android提权漏洞CVE-2014-