本文使用的軟體版本
Android:4.2.2
Linux核心:3.1.10
在上一篇文章中介紹了init的初始化第一階段,也就是處理各種屬性。在本文將會詳細分析init最重要的一環:解析init.rc檔案。
init.rc檔案並不是普通的設定檔,而是由一種被稱為“Android初始化語言”(Android Init Language,這裡簡稱為AIL)的指令碼寫成的檔案。在瞭解init如何解析init.rc檔案之前,先瞭解AIL非常必要,否則機械地分析init.c及其相關檔案的原始碼毫無意義。
為了學習AIL,讀者可以到自己Android手機的根目錄尋找init.rc檔案,最好下載到本地以便查看,如果有編譯好的Android原始碼,在<Android原始碼根目錄>out/target/product/generic/root目錄也可找到init.rc檔案。
AIL由如下4部分組成。
1. 動作(Actions)
2. 命令(Commands)
3. 服務(Services)
4. 選項(Options)
這4部分都是面向行的代碼,也就是說用斷行符號分行符號作為每一條語句的分隔字元。而每一行的代碼由多個符號(Tokens)表示。可以使用反斜線轉義符在Token中插入空格。雙引號可以將多個由空格分隔的Tokens合成一個Tokens。如果一行寫不下,可以在行尾加上反斜線,來串連下一行。也就是說,可以用反斜線將多行代碼串連成一行代碼。
AIL的注釋與很多Shell指令碼一行,以#開頭。
AIL在編寫時需要分成多個部分(Section),而每一部分的開頭需要指定Actions或Services。也就是說,每一個Actions或Services確定一個Section。而所有的Commands和Options只能屬於最近定義的Section。如果Commands和Options在第一個Section之前被定義,它們將被忽略。
Actions和Services的名稱必須唯一。如果有兩個或多個Action或Service擁有同樣的名稱,那麼init在執行它們時將拋出錯誤,並忽略這些Action和Service。
下面來看看Actions、Services、Commands和Options分別應如何設定。
Actions的文法格式如下:
on <trigger> <command> <command> <command>
也就是說Actions是以關鍵字on開頭的,然後跟一個觸發器,接下來是若干命令。例如,下面就是一個標準的Action。
on boot ifup lo hostname localhost domainname localdomain
其中boot是觸發器,下面三行是command
那麼init.rc到底支援哪些觸發器呢?目前init.rc支援如下5類觸發器。
1. boot
這是init執行後第一個被觸發Trigger,也就是在 /init.rc被裝載之後執行該Trigger
2. <name>=<value>
當屬性<name>被設定成<value>時被觸發。例如,
on property:vold.decrypt=trigger_reset_main
class_reset main