【Android Eclair】 如何寫Android init.rc(該文章翻譯自/system/core/init/readme.txt)

來源:互聯網
上載者:User

 

如何去寫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 <trigger>

   <command>

   <command>

   <command>

 

Services

--------

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

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

   <option>

   <option>

   ...

  

Options

-------

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

 

critical

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

 

disabled

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

 

setenv <name> <value>

     設定已啟動的進程的環境變數<name>的值<value>

 

socket <name> <type>
<perm> [ <user> [ <group> ] ]

     建立一個名為/dev/socket/<name>的unix domin socket,並傳送它的fd到已啟動的進程。<type>必須為"dgram"或"stream".使用者和組預設為0.

 

user <username>

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

 

group <groupname> [
<groupname> ]*

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

 

oneshot

     在服務退出後不重啟。

 

class <name>

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

 

onrestart

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

 

Triggers

--------

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

 

boot

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

 

<name>=<value>

     當property <name>被設為指定的值<value>時觸發。

 

device-added-<path>

device-removed-<path>

     當裝置節點被添加或移除時觸發。

 

service-exited-<name>

     當指定的服務存在時觸發

 

 

Commands

--------

 

exec <path> [ <argument>
]*

     Fork並執行一個程式(<path>).這將被block直到程式執行完畢。最好避免執行例如內建命令以外的程式,它可能會導致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>建立一個目錄,可選選項:mod,owner,group.如果沒有指定,目錄以755許可權,owner為root,group為root建立.

 

mount <type> <device>
<dir> [ <mountoption> ]*

     嘗試mount <device>到目錄<dir>. <device>可以用mtd@name格式以命名指定一個mtd塊裝置。<mountoption>包含"ro","rw","remount","noatime".

 

setkey

     暫時沒有

 

setprop <name> <value>

     設定系統property <name>的值<value>.

 

setrlimit <resource> <cur>
<max>

     設定resource的rlimit.

 

start <service>

     啟動一個沒有啟動並執行服務。

 

stop <service>

     停止一個正在啟動並執行服務。

 

symlink <target> <path>

     建立一個<path>的符號連結到<target>

 

sysclktz <mins_west_of_gmt>

     設定系統時區(GMT為0)

 

trigger <event>

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

 

write <path> <string> [
<string> ]*

     開啟<path>的檔案並寫入一個或多個字串。

 

 

Properties

----------

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

init.action

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

 

init.command

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

 

init.svc.<name>

     命名為<name>的服務的狀態("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

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.