2010年12月23日 星期四

Android Init Language

在Linux下的rcS用的一般都是shell script的語法撰寫, 但Android裡的init.rc似乎有他自己的一套

Android init language內的描述可分成兩種類型: Action, Service

Actions
on <trigger>
   <command>
   <command>
   <command>
   ......
其意義表示當trigger發生或成立時, 要執行哪些command
例如
on boot
  export PATH /sbin:/system/sbin:/system/bin
  export LD_LIBRARY_PATH /system/lib

  mkdir /dev
  mkdir /proc
  mkdir /sys
表示當boot發生了, 要去export一些環境變數以及建一些目錄.
官網中定義了幾個trigger的種類,
其他預設的trigger (ex. init, fs), 可以在system/core/init/init.c裡面找到

Services
service <name> <pathname> [ <argument> ]*
<option>
<option>
......
service定義的program, 除了option設為disable外, 會被init執行 (精確的說, 是action內的class_start default, 啟動了default的service)
例如
service zygote /system/bin/app_process -Xzygote /system/bin --zygote
  socket zygote 666
"zygote" 表示這個service的名稱
"/system/bin/app_process" 表示程式的路徑
"-Xzygote /system/bin --zygote" 表示要傳入程式的參數
"socket zygote 666" 是service的option, 表示開一個名為zygote的unix socket給這個service

合在一起看的例子
on device-added-/dev/compass
  start akmd

on device-removed-/dev/compass
  stop akmd

service akmd /sbin/akmd
  disabled
  user akmd
  group akmd
表示說akmd這個service並不會在init起來時被執行, 而是當/dev/compass產生時會被執行, 當/dev/compass移除時, 該service會被停掉

整個init.rc被執行的過程, 可參考"Android init 啟動過程分析"

參考資料:
[1] Android Init Language
[2] 如何去寫Android init.rc
[3] android init(system/core/init/init.c)分析
[4] Android init 啟動過程分析
[5] init.c

沒有留言:

張貼留言