2010年4月16日 星期五

轉-如何去寫Android init.rc (Android init language)

參考來源:http://embeddeder.spaces.live.com/blog/cns!8006E36532087D51!160.entry

如何去寫Android init.rc (Android init language)
Android初始化語言由四大類聲明組成:行為類(Actions),命令類(Commands),服務類(Services),選項類(Options).

* 初始化語言以行為單位,由以空格間隔的語言符號組成。C風格的反斜槓轉義符可以用來插入空白到語言符號。雙引號也可以用來防止文本被空格分成多個語言符號。當飯斜槓在行末時,作為折行符。

* 以#開始(前面允許有空格)的行為註釋行。

* Actions和Services隱含聲明一個新的段落。所有該段落下Commands或Options的聲明屬於該段落。第一段落前的Commands或Options被忽略。

* Actions和Services擁有獨一無二的命名。在它們之後聲明相同命名的類將被當作錯誤並忽略。

Actions

-------

Actions是一系列命令的命名。Actions擁有一個觸發器(trigger)用來決定action何時執行。當一個action在符合觸發條件被執行時,如果它還沒被加入到待執行隊列中的話,則加入到隊列最後。

隊列中的action依次執行,action中的命令也依次執行。Init在執行命令的中間處理其他活動(設備創建/銷毀,property設置,進程重啟)。

Actions表現形式為:

on





Services

--------

Services是由init啟動,在它們退出時重啟(可選)。Service表現形式為:

service [ ]*



...


Options

-------

Options是Services的修飾,它們影響init何時、如何運行service.


critical

這是一個設備關鍵服務(device-critical service) .如果它在4分鐘內退出超過4次,設備將重啟並進入恢復模式。


disabled

這個服務的級別將不會自動啟動,它必須被依照服務名指定啟動才可以啟動。


setenv

設置已啟動的進程的環境變量的值


socket [ [ ] ]

創建一個名為/dev/socket/的unix domin socket,並傳送它的fd到已啟動的進程。必須為"dgram"或"stream".用戶和組默認為0.


user

在執行服務前改變用戶名。當前默認為root.如果你的進程需要linux能力,你不能使用這個命令。你必須在還是root時請求能力,並下降到你需要的uid.


group [ ]*

在執行服務前改變組。在第一個組後的組將設為進程附加組(通過setgroups()).當前默認為root.


oneshot

在服務退出後不重啟。


class

為service指定一個類別名。同樣類名的所有的服務可以一起啟動或停止。如果沒有指定類別的服務默認為"default"類。


onrestart

當服務重啟時執行一個命令。


Triggers

--------

Triggers(觸發器)是一個字串,可以用來匹配某種類型的事件並執行一個action。


boot

這是當init開始後執行的第一個觸發器(當/init.conf被加載)


=

當property 被設為指定的值時觸發。


device-added-

device-removed-

當設備節點被添加或移除時觸發。


service-exited-

當指定的服務存在時觸發



Commands

--------


exec [ ]*

Fork並執行一個程序().這將被block直到程序執行完畢。最好避免執行例如內建命令以外的程序,它可能會導致init被阻塞不動。


export

設定全局環境變量的值,當這個命令執行後所有的進程都可以取得。


ifup

使網絡接口連線。


import

解析一個init配置文件,擴展當前配置文件。


hostname

設置主機名


chmod

改變文件訪問權限


chown

改變文件所屬和組


class_start

當指定類別的服務沒有運行,啟動該類別所有的服務。


class_stop

當指定類別的服務正在運行,停止該類別所有的服務。


domainname

設置域名。


insmod

加載該路徑的模塊


mkdir [mode] [owner] [group]

創建一個目錄,可選選項:mod,owner,group.如果沒有指定,目錄以755權限,owner為root,group為root創建.


mount [ ]*

嘗試mount 到目錄. 可以用mtd@name格式以命名指定一個mtd塊設備。包含"ro","rw","remount","noatime".


setkey

暫時沒有


setprop

設置系統property 的值.


setrlimit

設置resource的rlimit.


start

啟動一個沒有運行的服務。


stop

停止一個正在運行的服務。


symlink

創建一個的符號鏈接到


sysclktz

設置系統時區(GMT為0)


trigger

觸發一個事件。用於調用其他action。


write [ ]*

打開的文件並寫入一個或多個字串。



Properties

----------

Init會更新一些系統property以提供查看它正在幹嘛。

init.action

當前正在執行的action,如果沒有則為""


init.command

被執行的命令,如果沒有則為""


init.svc.

命名為的服務的狀態("stopped", "running", "restarting")



init.rc 示例:

-----------------


# 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 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.為了debug,你可以通過Android程序logwrapper執行你的程序。這將重定向輸出/錯誤輸出到Android logging系統(通過logcat訪問)。

例如

service akmd /system/bin/logwrapper /sbin/akmd

沒有留言: