android源碼學(xué)習(xí)目錄
了解Android init進程的都知道,啟動 init進程之前會解析init.rc文件,init.rc是Android的配置文件腳本,它由一種被稱為"Android初始化語言"--Android init Language 編寫。
1. android init language(簡稱 AIL)組成
- 動作--(Actions)
- 命令--(Commands)
- 服務(wù)--(Services)
- 選項--(Options)
2. 語法特性
- AIL是面向行的代碼,也就是每一行是一條語句,回車就是分隔符,一個語句包含若干個tokens, token之間需要有空格分割符,如果token中有空格需要通過c語言風格的反斜杠('\')來轉(zhuǎn)義,或者使用雙引號將整個token包裹起來。反斜杠出現(xiàn)在末尾表示下一行任屬于當前語句。
- 以#開始的行為注釋,
- AIL編寫分成多個(Section), 每個部分的開頭需要指定Actions或Services,也就是每個Actions和Services都是一個Section,所有的Commands和Options只能屬于定義的這個Section,
- Actions和Services的名稱必須唯一,如果多個一樣的名字,后面聲明的將被忽略為一個錯誤。
3. Actions
Actions是被命名的命令(command)序列,由觸發(fā)器來決定這個actions什么時候發(fā)生,當一個時間觸發(fā)了一個符合的action觸發(fā)器,這個action就會被添加到處理隊列尾部(它已經(jīng)存在在對列除外)。
在處理隊列中沒一個action都按照排序出列,action中的command也按照順序執(zhí)行,
Actions的結(jié)構(gòu)
on <trigger>
? <command>
? <command>
? <command>
如上:Actions以關(guān)鍵字 on 開頭,然后跟一個觸發(fā)器,接下來是若干命令。
觸發(fā)器
觸發(fā)器是一個字符串,用于匹配特定的事件,
#這個是boot觸發(fā)器, 下面三行是command
on boot
ifup lo
hostname localhost
domainname localdomain
4.Services
服務(wù)是初始化程序init需要啟動的一些程序,初始化程序可能在這些程序退出后重啟他們
Services的形式
service <name> <pathname> [ <argument> ] *
? <option>
? <option>
5.Options
選項屬于服務(wù),它將影響初始化程序運行服務(wù)的時機和方法??赡艿倪x項如下
| 選項 | 說明 |
|---|---|
| disabled | 此服務(wù)不會自動從其類啟動。它必須按名稱顯式啟動。 |
socket <name><type> <perm> [ <user> [ <group> ] ] |
創(chuàng)建一個名為/dev/socket/<name>的unix域套接字,并將其fd傳遞給啟動的進程。有效的<type>值包括dgram和stream。用戶和組默認為0。 |
| user <username> | 在執(zhí)行此服務(wù)之前更改為用戶名。當前默認為root |
| group <groupname> [ <groupname> ]* | 在執(zhí)行此服務(wù)之前更改為groupname。第一個組之外的其他組名(這是必需的)用于設(shè)置進程的其他組(使用set groups())。當前默認為root |
| capability [ <capability> ]+ | 在執(zhí)行此服務(wù)之前設(shè)置linux功能 |
| class <name> | 指定服務(wù)的類名。命名類中的所有服務(wù)必須一起啟動和停止。如果服務(wù)不是通過類選項指定的,則將其視為類“默認”。 |
| oneshot | 退出時不要重新啟動服務(wù)。 |
6.觸發(fā)器
上文中介紹過觸發(fā)器,這里列舉init.rc有的幾個
| 觸發(fā)器 | 功能 |
|---|---|
| boot | 這是init啟動時(加載/init.conf之后)發(fā)生的第一個觸發(fā)器。 |
| <name>=<value> | 當屬性<name>設(shè)置為特定值<value>時,會觸發(fā)此觸發(fā)器 |
| device-added-<path> device-removed-<path> |
當添加或刪除設(shè)備節(jié)點時,會觸發(fā)這些觸發(fā)器。 |
| service-exited-<name> | 當指定服務(wù)退出時,將觸發(fā)這些觸發(fā)器。 |
7.指令--Commands
command是Actions的一部分,用于執(zhí)行一條命名
| command | 說明 |
|---|---|
| exec <path> [ <argument> ]* | 創(chuàng)建并執(zhí)行程序(<path>)。這將阻塞直到程序完成執(zhí)行。盡量避免執(zhí)行。與內(nèi)置命令不同的是,它會冒著讓init“卡住”的風險。 |
| export <name> <value> | 將全局環(huán)境中的環(huán)境變量<name>設(shè)置為<value>(執(zhí)行此命令后啟動的所有進程都將繼承該變量)。 |
| ifup <interface> | 使網(wǎng)絡(luò)接口<interface>在線。 |
| import <filename> | 解析init配置文件,擴展當前配置。導(dǎo)入文件 |
| hostname <name> | Set the host name. |
| class_start <serviceclass> | 如果指定類的所有服務(wù)尚未運行,請啟動它們。 |
| class_stop <serviceclass> | 如果指定類的所有服務(wù)當前正在運行,請停止這些服務(wù)。 |
| domainname <name> | 設(shè)置域名。 |
| insmod <path> | 下載模塊到path |
| mkdir <path> | Make a directory at <path>. |
| mount <type> <device> <dir> [ <mountoption> ]* | 嘗試在目錄<dir><device>中掛載已命名設(shè)備。它的格式可以是mtd@name,以便按名稱指定mtd塊設(shè)備。 |
| setkey | -當前未定義- |
| setprop <name> <value> | 將系統(tǒng)屬性<name>設(shè)置為<value>。 |
| setrlimit <resource> <cur> <max> | 為資源設(shè)置一個限制。 |
| start <service> | Start a service running if it is not already running. |
| symlink <target> <path> | 用<target>在<path>處創(chuàng)建link。 |
| write <path> <string> [ <string> ]* | 打開path處文件,并使用write(2)向文件寫入一個或多個字符 |
8.配置屬性
初始化程序(Init)可以根據(jù)需要修改一些系統(tǒng)的屬性。
| 屬性 | 說明 |
|---|---|
| init.action | 等于當前正在執(zhí)行的操作的名稱,如果沒有,則為“” |
| init.command | 等于正在執(zhí)行的命令,如果沒有,則為“” |
| init.svc.<name> | 服務(wù)的狀態(tài)("stopped", "running", or "restarting"). |