Android init.rc文件淺析


本文主要來自$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 keyword

token:  計算機語言中的一個單詞,就跟英文中的單詞幾乎相同一人概念.

Section: 語句塊,相當於C語言中大括號內的一個塊。一個Section以Service或On開頭的語句塊.以Service開頭的Section叫做服務,而以On開頭的叫做動作(Action).

services: 服務.

Action: 動作

commands:命令.

options:選項.

trigger:觸發器。或者叫做觸發條件.

class: 類屬,即能夠為多個service指定一個同樣的類屬,方便操作同一時候啟動或停止.

3 語句解析

3.1 動作(Action)

動作表示了一組命令(commands)組成.動作包括一個觸發器,決定了何時運行這個動作。當觸發器的條件滿足時,這個動作會被增加到已被運行的隊列尾。假設此動作在隊列中已經存在,那么它將不會運行.

 一個動作所包括的命令將被依次運行。動作的語法例如以下所看到的:

[plain]  view plain copy
  1. on <trigger>  
  2.    <command>  
  3.    <command>  
  4.    <command>  

3.2 服務(services)

服務是指那些須要在系統初始化時就啟動或退出時自己主動重新啟動的程序.

它的語法結構例如以下所看到的:

[plain]  view plain copy
  1. service <name> <pathname> [ <argument> ]*  
  2.    <option>  
  3.    <option>  
  4.    ...  


3.3 選項(options)

選項是用來改動服務的。它們影響怎樣及何時執行這個服務.

選項 描寫敘述
critical 據設備相關的關鍵服務,假設在4分鍾內。此服務反復啟動了4次,那么設備將會重新啟動進入還原模式。
disabled 服務不會自己主動執行,必須顯式地通過server來啟動。
setenv <name> <value> 環境變量設置
socket <name> <type> <perm> [ <user> [ <group> ] ] 在/dev/socket/下創建一個unix domain的socket。並傳遞創建的文件描寫敘述符fd給服務進程.當中type必須為dgram或stream,seqpacket.username和組名默覺得0
user <username> 在運行此服務之前先切換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.username為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 plain copy
  1. # not complete -- just providing some examples of usage  
  2. #  
  3. on boot  
  4.    export PATH /sbin:/system/sbin:/system/bin  
  5.    export LD_LIBRARY_PATH /system/lib  
  6.   
  7.    mkdir /dev  
  8.    mkdir /proc  
  9.    mkdir /sys  
  10.   
  11.    mount tmpfs tmpfs /dev  
  12.    mkdir /dev/pts  
  13.    mkdir /dev/socket  
  14.    mount devpts devpts /dev/pts  
  15.    mount proc proc /proc  
  16.    mount sysfs sysfs /sys  
  17.   
  18.    write /proc/cpu/alignment 4  
  19.   
  20.    ifup lo  
  21.   
  22.    hostname localhost  
  23.    domainname localhost  
  24.   
  25.    mount yaffs2 mtd@system /system  
  26.    mount yaffs2 mtd@userdata /data  
  27.   
  28.    import /system/etc/init.conf  
  29.   
  30.    class_start default  
  31.   
  32. service adbd /sbin/adbd  
  33.    user adb  
  34.    group adb  
  35.   
  36. service usbd /system/bin/usbd -r  
  37.    user usbd  
  38.    group usbd  
  39.    socket usbd 666  
  40.   
  41. service zygote /system/bin/app_process -Xzygote /system/bin --zygote  
  42.    socket zygote 666  
  43.   
  44. service runtime /system/bin/runtime  
  45.    user system  
  46.    group system  
  47.   
  48. on device-added-/dev/compass  
  49.    start akmd  
  50.   
  51. on device-removed-/dev/compass  
  52.    stop akmd  
  53.   
  54. service akmd /sbin/akmd  
  55.    disabled  
  56.    user akmd  
  57.    group akmd  
  58.    

5 調試注意事項

在默認情況下,通過init程序啟動的程序的標准輸出stdout和標准錯誤輸出stderr會重定向到/dev/null.如:

[plain]  view plain copy
  1. service akmd /system/bin/logwrapper /sbin/akmd  

為了更方便調試你的程序,你能夠使用Android的log系統。標准輸出和標准錯誤輸出會重定義到Android的log系統中來.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM