Android初始化語言 (init.*.rc、init.conf文件格式)

Android初始化語言 (init.*.rc、init.conf文件格式)

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

    所有這些都是以行為單位的,各種記號由空格來隔開。C語言風格的反斜杠號可用於在記號間插入空格。雙引號也可用於防止字符串被空格分割成多個記
    註釋行以井號(#)開頭(允許以空格開頭)。
    Actions和Services聲明一個新的分組。所有的命令或選項都屬於最近申明的分組。位於第一個分組之前的命令或選項將會被忽略。
    Actions和Services有唯一的名字。如果有重名的情況,第二個申明的將會被作為錯誤忽略。( ???我們是否應該以覆蓋來代替忽略)

Actions (行動) www.aiwalls.com
———-
    Actions其實就是一序列的Commands (命令)。Actions都有一個trigger (觸發器),它被用於決定action的執行時間。當一個符合action觸發條
    隊列中的每一個action都被依次提取出,而這個action中的每個command (命令)都將被依次執行。Init在這些命令的執行期間還控制著其他的活動(

Actions的形式如下:

    on <trigger>
       <command>
       <command>
       <command>

Services (服務)
———-
    Services (服務)是一個程序,他在初始化時啟動,並在退出時重啟(可選)。Services (服務)的形式如下:

    service <name> <pathname> [ <argument> ]*
       <option>
       <option>
       …

Options (選項)
———-
Options (選項)是一個Services (服務)的修正者。他們影響Services (服務)在何時,並以何種方式運行。

critical (關鍵)
說明這是一個對於設備關鍵的服務。如果他四分鐘內退出大於四次,系統將會重啟並進入 recovery (恢復)模式。

disabled (失效)
說明這個服務不會同與他同trigger (觸發器)下的服務自動啟動。他必須被明確的按名啟動。

setenv <name> <value> (設置環境變量)
在進程啟動時將環境變量<name>設置為<value>。

socket <name> <type> <perm> [ <user> [ <group> ] ]
創建一個Uinx域的名為/dev/socket/<name> 的套接字,並傳遞它的文件描述符給已啟動的進程。<type> 必須是 "dgram"或"

user <username>
在啟動這個服務前改變該服務的用戶名。此時默認為 root。(???有可能的話應該默認為nobody)。當前,如果你的進程要求L

group <groupname> [ <groupname> ]*
在啟動這個服務前改變該服務的組名。除瞭(必需的)第一個組名,附加的組名通常被用於設置進程的補充組(通過setgroups()

oneshot
服務退出時不重啟。

class <name>
指定一個服務類。所有同一類的服務可以同時啟動和停止。如果不通過class選項指定一個類,則默認為"default"類服務。

onrestart
當服務重啟,執行一個命令(下詳)。

Triggers (觸發器)
———-
   Triggers (觸發器)是一個用於匹配特定事件類型的字符串 ,用於使Actions (行動)發生。

   boot
   這是init執行後的第一個被觸發的Triggers (觸發器)。(在 /init.conf (啟動配置文件)被裝載之後)

   <name>=<value>
   這種形式的Triggers (觸發器)會在屬性<name>被設置為指定的<value>時被觸發。

   device-added-<path>
   device-removed-<path>

   這種形式的Triggers (觸發器)會在一個設備節點文件被增刪時觸發。

   service-exited-<name>
   這種形式的Triggers (觸發器)會在一個特定的服務退出時觸發。

Commands (命令)
———-
   exec <path> [ <argument> ]*
   創建和執行一個程序(<path>)。在程序完全執行前,init將會阻塞。由於它不是內置命令,應盡量避免使用exec ,它可能會引起init卡

   export <name> <value>
   在全局環境變量中設在環境變量 <name>為<value>。(這將會被所有在這命令之後運行的進程所繼承)
       
   ifup <interface>
   啟動網絡接口<interface>

   import <filename>
   解析一個init配置文件,擴展當前配置。

   hostname <name>
   設置主機名。

   chmod <octal-mode> <path>
   更改文件訪問權限。

   chown <owner> <group> <path>
   更改文件的所有者和組。

   class_start <serviceclass>
   啟動所有指定服務類下的未運行服務。

   class_stop <serviceclass>
   停止指定服務類下的所有已運行的服務。

   domainname <name>
   設置域名。

   insmod <path>
   加載<path>中的模塊。

   mkdir <path> [mode] [owner] [group]
   創建一個目錄<path> ,可以選擇性地指定mode、owner以及group。如果沒有指定,默認的權限為755 ,並屬於root用戶和 root組。

   mount <type> <device> <dir> [ <mountoption> ]*
   試圖在目錄<dir>掛載指定的設備。<device> 可以是以 mtd@name  的形式指定一個mtd塊設備。<mountoption>包括 "ro"、"rw"、"re

   setkey
   待完成 …… (暫時不可用)

   setprop <name> <value>
   設置系統屬性 <name> 為 <value>值 .

   setrlimit <resource> <cur> <max>
   設置<resource>的rlimit (資源限制)。

   start <service>
   啟動指定服務(如果此服務還未運行)。

   stop <service>
   停止指定服務(如果此服務在運行中)。

   symlink <target> <path>
   創建一個指向<path>的軟連接<target>。

   sysclktz <mins_west_of_gmt>
   設置系統時鐘基準(0代表時鐘滴答以格林威治平均時(GMT)為準)

   trigger <event>
   觸發一個事件。用於將一個action與另一個 action排列。(?????)

   write <path> <string> [ <string> ]*
   打開路徑為<path>的一個文件,並寫入一個或多個字符串。

Properties (屬性)
———-
Init更新一些系統屬性以提供對正在發生的事件的監控能力 :

init.action
此屬性值為正在被執行的action的名字,如果沒有則為""。

init.command
此屬性值為正在被執行的command的名字,如果沒有則為""。

init.svc.<name>
名為<name>的service的狀態("stopped" (停止), "running" (運行), "restarting" (重啟))

init.conf實例
—————–

# 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/cp /alignment 4

   ifup lo

   hostname localhost
   domainname localhost

   mount yaffs2 mtd@system  /system
   mount yaffs2 mtd@userdata /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

調試記錄
—————
在默認情況下,程序在被init執行時會將標準輸出和標準錯誤都重定向到/dev/null (丟棄)。若你想要獲得調試信息,你可以通過Andoird系統中的logwrapp

例如:
service akmd /system/bin/logwrapper /sbin/akmd

作者:紅獵人

發佈留言