[導(dǎo)讀][概述] 用于指導(dǎo)init進程如何啟動Android系統(tǒng),由若干個段(Sections)組成; init進程解析/init.rc腳本 [功能] [1] 控制init進程何時如何執(zhí)行某個動作 [2] 控制init進程何時如何啟動某個服務(wù) [語法] init rc腳本包含導(dǎo)入(import)、動作(Actions)、命令(Command
[概述]
用于指導(dǎo)init進程如何啟動Android系統(tǒng),由若干個段(Sections)組成;
[功能]
[1] 控制init進程何時如何執(zhí)行某個動作
[2] 控制init進程何時如何啟動某個服務(wù)
[語法]
init rc腳本包含導(dǎo)入(import)、動作(Actions)、命令(Commands)、服務(wù)(Service)和選項(Options)五種語句,語法如下:基本語法每個語句占一行,由若干個空格分隔的標記組成,標記之間用空格或TAB分割,若標記中存在空格需要用'\'轉(zhuǎn)義(或使用"單詞 單詞"形式)例:init.rc文件export xxy /system/frame\ workexport xxy /system/"frame work"語句太長,一行寫不下,可以用'\'將多行連接成一行, '\'字符后不能有任何字符,包括空格:service wpa_supplicant /system/bin/wpa_supplicant -Dwext -iwlan0 \-c/data/misc/wifi/wpa_supplicant.conf -e/data/misc/wifi/entropy.bin以'#'打頭的行為注釋行:# setup the global environment一個導(dǎo)入(import)、動作(Actions)或服務(wù)(Service)語句是一個段(Sections)命令(Commands)屬于上面離它最近的動作(Actions),單獨的命令將被忽略選項(Options)屬于上面離它最近的服務(wù)(Service),單獨的選項將被忽略語句導(dǎo)入(import)------------組成:import <filename>filenamerc腳本文件:import init.sun5i.usb.rc動作(Actions)-------------組成:on <name or trigger><command>... ><command>on動作的關(guān)鍵字名字(name)rc腳本中必須唯一,如果存在相同名字(name)的動作,只有第一個動作有效,:early-initinit進程啟動后,掛載虛擬文件系統(tǒng)及/dev目錄之后促發(fā),通常用于完成冷啟動設(shè)備文件建立init完成默認屬性(/default.prop)、logo顯示和設(shè)置硬件只讀屬性,冷啟動設(shè)備文件建立完成之后,文件系統(tǒng)掛載之前,通常用于完成文件系統(tǒng)目錄結(jié)構(gòu)的建立:early-fs、fs、post-fs和post-fs-datainit動作執(zhí)行完成之后促發(fā),用于掛載各種類型的文件系統(tǒng)early-boot和boot完成post-fs-data動作、系統(tǒng)屬性(/system/build.prop和/system/default.prop文件)加載和用戶屬性(/data/local.prop文件和data/property目錄下文件中)加載、信號初始化之后,用于完成設(shè)備使能和shell環(huán)境初始化:late-init相當于early-fs、fs、post-fs、post-fs-data、early-boot和boot動作的合并property:屬性名=屬性值屬性被設(shè)置成"屬性值"時促發(fā): init.rc文件的306行on property:prop.test=test_valuemkdir /data/temp 0775 root systemcommand命令,屬于上面離它最近的動作(Actions),單獨的命令將被忽略執(zhí)行當動作被促發(fā)時,動作將會被添加到動作執(zhí)行隊列,當動作中的所有命令依次執(zhí)行完畢時,動作從執(zhí)行隊列中刪除;init程序還添加了一些內(nèi)部動作,詳細見第二天《課堂筆記》命令(Commands)-------------exec <path> [ argument ... ]fork + exec 執(zhí)行指定程序,init進程會阻塞等待程序執(zhí)行完成path 帶路徑的程序名argument 程序參數(shù)export <name> <value>設(shè)置init進程環(huán)境變量,完成后會被所有init啟動的新進程繼承name 環(huán)境變量名value 環(huán)境變量的值:export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbinifup <interface>使能網(wǎng)卡interface 網(wǎng)卡設(shè)備名:ifup lohostname <name>設(shè)置主機名name 主機名:hostname localhostchmod <octal-mode> <path>修改文件或目錄的模式(通常指權(quán)限)8進制的數(shù)表示的權(quán)限path 帶路徑的文件或目錄:chmod 0664 /sys/module/lowmemorykiller/parameters/adjchown <owner> <group> <path>修改文件或目錄的所有者和組owner 所有者group 組path 帶路徑的文件或目錄:chown root system /sys/module/lowmemorykiller/parameters/minfreeclass_start <serviceclass>啟動某一類的服務(wù)serviceclass 服務(wù)類:class_start coreclass_stop <serviceclass>停止某一類的服務(wù)serviceclass 服務(wù)類<name>設(shè)置域名(一組計算機的集合)<path>加載內(nèi)核驅(qū)動模塊path 帶路徑的內(nèi)核驅(qū)動模塊:insmod /system/vendor/modules/gslX680.ko<path> [mode owner group]新建目錄path 帶路徑的命令名mode 文件模式(通常指權(quán)限)owner 文件所有者group 文件組mode owner group為選擇指定,不指定為0755 root root:mkdir /mnt 0775 root system<type> <device> <dir> [ mountoption ... ]掛載文件系統(tǒng)type 文件系統(tǒng)類型device 文件系統(tǒng)所在設(shè)備dir 掛載目錄mountoption 參數(shù)和Linux的mount命令類似:mount cgroup none /acct cpuacct<name> <value>設(shè)置屬性值name 屬性名value 屬性值:setprop net.tcp.buffersize.default 4096,87380,110208,4096,16384,110208<resource> <cur> <max>設(shè)置系統(tǒng)資源限制resource 資源編號cur 資源當前(軟件)限制值max 資源最大(硬件)限制值:setrlimit 13 40 40<service>啟動服務(wù)service 服務(wù)名:start ueventd<service>停止服務(wù)service 服務(wù)名:stop adbd<target> <path>建立軟鏈接文件target 軟鏈接文件path 帶路徑的源文件:symlink /system/etc /etc<mins_west_of_gmt>設(shè)置系統(tǒng)基準時間mins_west_of_gmt 設(shè)置格林尼治時間差幾分鐘,一般為0:sysclktz 0<event>促發(fā)一個動作event 動作:trigger post-fs-data<path> <string> [ string ... ]寫字符串到文件中path 帶路徑的文件名string 字符串,可以有多個:write /proc/sys/kernel/panic_on_oops 1<path>修改init進程的當前目錄<path>刪除文件path 帶路徑的文件名<path>刪除目錄path 帶路徑的目錄名<path>等待文件被創(chuàng)建path 帶路徑的文件名<level>設(shè)置內(nèi)核的log級別level 內(nèi)核級別(0-7): init.rc文件中的7行loglevel 6:所有命令的執(zhí)行函數(shù)所有動作、服務(wù)、命令和選項列表服務(wù)(Service)-------------:service <name> <pathname> [argument ...]<option>... ><option>namerc腳本中必須唯一pathname [argument ...]帶路徑的服務(wù)程序名及參數(shù)option說明服務(wù)的選項選項(Options)-------------:critical4分鐘之內(nèi)重啟了4次該服務(wù),重啟Android系統(tǒng)進入recovery模式disabled服務(wù)不能使用start_class命令啟動,必須通過服務(wù)名稱啟動setenv <name> <value>設(shè)置環(huán)境變量,并且將其做為服務(wù)進程的環(huán)境變量name 環(huán)境變量名value 設(shè)置的值socket <name> <type> <perm> [user [group]]創(chuàng)建unix域socket(即創(chuàng)建文件/dev/socket/<name>),并且打開,將文件描述符傳給服務(wù)文件描述符存在ANDROID_SOCKET_<name>的環(huán)境變量中name socket名type socket類型,只能dgram、stream和seqpacketdgram 無序報文傳送,不保證可靠seqpacket 順序報文傳送,不保證可靠stream 流傳送,保證可靠perm 指定權(quán)限(八進制的數(shù)表示)user 指定所屬用戶, 默認root用戶group 指定所屬主,默認root組user <username>指定服務(wù)進程所屬用戶,默認rootusername 用戶名group <groupname> [groupname] [...]默認rootgroupname 組名oneshot服務(wù)進程退出時,不重啟class <name>指定服務(wù)所屬類,這樣可以使用class_start命令啟動同一類的多個服務(wù)如果沒有指定,服務(wù)屬于默認(default)類name 類名onrestart <command>服務(wù)重啟時,運行指定程序command 命令及其參數(shù)例:在init.rc和init.sun5i.rc中尋找調(diào)試注意:默認Android系統(tǒng)會將進程的標準輸出和標準錯誤重定位到/dev/null(沒有設(shè)置console)或/dev/console(有設(shè)置console)如果想看到進程輸出,請使用logwrapper程序啟動進程,如:service akmd /system/bin/logwrapper /sbin/akmdProperties----------init進程的屬性值,使別的進程可以看到init進程當前的運行狀態(tài):init.actioninit進程當前正在執(zhí)行的動作的名稱init.commandinit進程當前正在執(zhí)行的命令的名稱init.svc.<name>指定服務(wù)的狀態(tài)(stopped、running和restarting),name為服務(wù)名:getprop init.svc.zygote返回running
韋東山嵌入式Android課程推薦
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!





