Android的启动脚本–init.rc
在 Android中使用啟動腳本init.rc可以在系統的初始化過程中進行一些簡單的初始化操作。這個腳本被直接安裝到目標系統的根文件系統中,被 init可執行程序解析。 init.rc是在init啟動后被執行的啟動腳本。
我們可以通過修改init.rc腳本來修改啟動過程。但是,一般情況下,我們不直接修改init.rc,而是在文件init.%PRODUCT%.rc文件中添加或修改我們需要的額外的初始化配置。因為init.c中的main函數在解析完init.rc以后會繼續解析init.%PRODUCT%.rc文件。要特別強調的是,init.rc文件和init.%PRODUCT%.rc文件都是用Android Init Language語言來編寫的。
Android Init Language由四種類別的語句組成:Actions、Commands、Services、Options。
–Actions–
Actions是一系列命令的命名。Actions擁有一個觸發器(trigger)用來決定action何時執行。當一個action在符合觸發條件被執行時,如果它還沒被加入到待執行隊列中的話,則加入到隊列最后。
隊列中的action依次執行,action中的命令也依次執行。Init在執行命令的中間處理其它活動(設備創建/銷毀,property設置,進程重啟)。
Actions表現形式為:
on <trigger>
<command>
<command>
<command>
–Services–
Services是由init啟動,在它們退出時重啟(可選)。Service表現形式為:
service <name> <pathname> [ <argument> ]*
<option>
<option>
–Options–
Options是Services的修飾,它們影響init何時、如何運行service。
critical
這是一個設備關鍵服務(device-critical service) 。如果它在4分鐘內退出超過4次,設備將重啟并進入恢復模式。
disabled
這個服務的級別將不會自動啟動,它必須被依照服務名指定啟動才可以啟動。
setenv <name> <value>
設置已啟動的進程的環境變量<name>的值<value>。
socket <name> <type> <perm> [ <user> [ <group> ] ]
創建一個名為/dev/socket/<name>的unix domin socket,并傳送它的fd到已啟動的進程。<type>必須為”dgram”或”stream”。用戶和組默認為0。
user <username>
在執行服務前改變用戶名。當前默認為root。如果你的進程需要linux能力,你不能使用這個命令。你必須在還是root時請求能力,并下降到你需要的uid。
group <groupname> [ <groupname> ]*
在執行服務前改變組。在第一個組后的組將設為進程附加組(通過setgroups())。當前默認為root。
oneshot
在服務退出后不重啟。
class <name>
為service指定一個類別名。同樣類名的所有的服務可以一起啟動或停止。如果沒有指定類別的服務默認為”default”類。
onrestart
當服務重啟時執行一個命令。
–Triggers–
Triggers(觸發器)是一個字符串,可以用來匹配某種類型的事件并執行一個action。
boot
這是當init開始后執行的第一個觸發器(當/init.conf被加載)。
<name>=<value>
當property <name>被設為指定的值<value>時觸發。
device-added-<path>
device-removed-<path>
當設備節點被添加或移除時觸發。
service-exited-<name>
當指定的服務存在時觸發。
–Commands–
exec <path> [ <argument> ]*
Fork并執行一個程序(<path>)。這將被block直到程序執行完畢。最好避免執行例如內建命令以外的程序,它可能會導致init被阻塞不動。
export <name> <value>
設定全局環境變量<name>的值<value>,當這個命令執行后所有的進程都可以取得。
ifup <interface>
使網絡接口<interface>聯機。
import <filename>
解析一個init配置文件,擴展當前配置文件。
hostname <name>
設置主機名。
chmod <octal-mode> <path>
改變文件訪問權限。
chown <owner> <group> <path>
改變文件所屬和組。
class_start <serviceclass>
當指定類別的服務沒有運行,啟動該類別所有的服務。
class_stop <serviceclass>
當指定類別的服務正在運行,停止該類別所有的服務。
domainname <name>
設置域名。
insmod <path>
加載該路徑<path>的模塊。
mkdir <path> [mode] [owner] [group]
在<path>創建一個目錄,可選選項:mod、owner、group。如果沒有指定,目錄以755權限,owner為root,group為root創建。
mount <type> <device> <dir> [ <mountoption> ]*
嘗試mount <device>到目錄<dir>。<device>可以用格式以命名指定一個mtd塊設備。<mountoption>包含”ro”,”rw”,”remount”,”noatime”。
setkey
暫時沒有。
setprop <name> <value>
設置系統property <name>的值<value>。
setrlimit <resource> <cur> <max>
設置resource的rlimit。
start <service>
啟動一個沒有運行的服務。
stop <service>
停止一個正在運行的服務。
symlink <target> <path>
創建一個<path>的符號鏈接到<target>。
sysclktz <mins_west_of_gmt>
設置系統時區(GMT為0)。
trigger <event>
觸發一個事件。用于調用其它action。
write <path> <string> [ <string> ]*
打開<path>的文件并寫入一個或多個字符串。
–Properties–
Init會更新一些系統property以提供查看它正在干嘛。
init.action
當前正在執行的action,如果沒有則為”"。
init.command
被執行的命令,如果沒有則為”"。
init.svc.<name>
轉載于:https://www.cnblogs.com/nick-zhang/p/3733641.html
總結
以上是生活随笔為你收集整理的Android的启动脚本–init.rc的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 15 个最佳的 jQuery 表格插件
- 下一篇: 将公用文件夹从Exchange2010迁