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
沒有留言:
張貼留言