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