Android init.rc腳本詳解
[概述]
用于指導(dǎo)init進(jìn)程如何啟動(dòng)Android系統(tǒng),由若干個(gè)段(Sections)組成;
[功能]
[1] 控制init進(jìn)程何時(shí)如何執(zhí)行某個(gè)動(dòng)作
[2] 控制init進(jìn)程何時(shí)如何啟動(dòng)某個(gè)服務(wù)
[語(yǔ)法]
init rc腳本包含導(dǎo)入(import)、動(dòng)作(Actions)、命令(Commands)、服務(wù)(Service)和選項(xiàng)(Options)五種語(yǔ)句,語(yǔ)法如下:
基本語(yǔ)法
每個(gè)語(yǔ)句占一行,由若干個(gè)空格分隔的標(biāo)記組成,標(biāo)記之間用空格或TAB分割,若標(biāo)記中存在空格需要用'\'轉(zhuǎn)義(或使用"單詞 單詞"形式)
例:init.rc文件
export xxy /system/frame\ work
export xxy /system/"frame work"
語(yǔ)句太長(zhǎng),一行寫不下,可以用'\'將多行連接成一行, '\'字符后不能有任何字符,包括空格
:
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
一個(gè)導(dǎo)入(import)、動(dòng)作(Actions)或服務(wù)(Service)語(yǔ)句是一個(gè)段(Sections)
命令(Commands)屬于上面離它最近的動(dòng)作(Actions),單獨(dú)的命令將被忽略
選項(xiàng)(Options)屬于上面離它最近的服務(wù)(Service),單獨(dú)的選項(xiàng)將被忽略
語(yǔ)句
導(dǎo)入(import)
------------
組成:
import <filename>
filename
rc腳本文件
:
import init.sun5i.usb.rc
動(dòng)作(Actions)
-------------
組成:
on <name or trigger>
<command>
... >
<command>
on
動(dòng)作的關(guān)鍵字
名字(name)
rc腳本中必須唯一,如果存在相同名字(name)的動(dòng)作,只有第一個(gè)動(dòng)作有效,
:
early-init
init進(jìn)程啟動(dòng)后,掛載虛擬文件系統(tǒng)及/dev目錄之后促發(fā),通常用于完成冷啟動(dòng)設(shè)備文件建立
init
完成默認(rèn)屬性(/default.prop)、logo顯示和設(shè)置硬件只讀屬性,冷啟動(dòng)設(shè)備文件建立完成之后,文件系統(tǒng)掛載之前,通常用于完成文件系統(tǒng)目錄結(jié)構(gòu)的建立
:
early-fs、fs、post-fs和post-fs-data
init動(dòng)作執(zhí)行完成之后促發(fā),用于掛載各種類型的文件系統(tǒng)
early-boot和boot
完成post-fs-data動(dòng)作、系統(tǒng)屬性(/system/build.prop和/system/default.prop文件)加載和用戶屬性(/data/local.prop文件和data/property目錄下文件中)加載、信號(hào)初始化之后,
用于完成設(shè)備使能和shell環(huán)境初始化
:
late-init
相當(dāng)于early-fs、fs、post-fs、post-fs-data、early-boot和boot動(dòng)作的合并
property:屬性名=屬性值
屬性被設(shè)置成"屬性值"時(shí)促發(fā)
init.rc文件的306行 :
on property:prop.test=test_value
mkdir /data/temp 0775 root system
command
命令,屬于上面離它最近的動(dòng)作(Actions),單獨(dú)的命令將被忽略
執(zhí)行
當(dāng)動(dòng)作被促發(fā)時(shí),動(dòng)作將會(huì)被添加到動(dòng)作執(zhí)行隊(duì)列,當(dāng)動(dòng)作中的所有命令依次執(zhí)行完畢時(shí),動(dòng)作從執(zhí)行隊(duì)列中刪除;
init程序還添加了一些內(nèi)部動(dòng)作,詳細(xì)見第二天《課堂筆記》
命令(Commands)
-------------
exec <path> [ argument ... ]
fork + exec 執(zhí)行指定程序,init進(jìn)程會(huì)阻塞等待程序執(zhí)行完成
path 帶路徑的程序名
argument 程序參數(shù)
export <name> <value>
設(shè)置init進(jìn)程環(huán)境變量,完成后會(huì)被所有init啟動(dòng)的新進(jìn)程繼承
name 環(huán)境變量名
value 環(huán)境變量的值
:
export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin
ifup <interface>
使能網(wǎng)卡
interface 網(wǎng)卡設(shè)備名
:
ifup lo
hostname <name>
設(shè)置主機(jī)名
name 主機(jī)名
:
hostname localhost
chmod <octal-mode> <path>
修改文件或目錄的模式(通常指權(quán)限)
8進(jìn)制的數(shù)表示的權(quán)限
path 帶路徑的文件或目錄
:
chmod 0664 /sys/module/lowmemorykiller/parameters/adj
chown <owner> <group> <path>
修改文件或目錄的所有者和組
owner 所有者
group 組
path 帶路徑的文件或目錄
:
chown root system /sys/module/lowmemorykiller/parameters/minfree
class_start <serviceclass>
啟動(dòng)某一類的服務(wù)
serviceclass 服務(wù)類
:
class_start core
class_stop <serviceclass>
停止某一類的服務(wù)
serviceclass 服務(wù)類
<name>
設(shè)置域名(一組計(jì)算機(jī)的集合)
<path>
加載內(nèi)核驅(qū)動(dòng)模塊
path 帶路徑的內(nèi)核驅(qū)動(dòng)模塊
:
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 資源編號(hào)
cur 資源當(dāng)前(軟件)限制值
max 資源最大(硬件)限制值
:
setrlimit 13 40 40
<service>
啟動(dòng)服務(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)基準(zhǔn)時(shí)間
mins_west_of_gmt 設(shè)置格林尼治時(shí)間差幾分鐘,一般為0
:
sysclktz 0
<event>
促發(fā)一個(gè)動(dòng)作
event 動(dòng)作
:
trigger post-fs-data
<path> <string> [ string ... ]
寫字符串到文件中
path 帶路徑的文件名
string 字符串,可以有多個(gè)
:
write /proc/sys/kernel/panic_on_oops 1
<path>
修改init進(jìn)程的當(dāng)前目錄
<path>
刪除文件
path 帶路徑的文件名
<path>
刪除目錄
path 帶路徑的目錄名
<path>
等待文件被創(chuàng)建
path 帶路徑的文件名
<level>
設(shè)置內(nèi)核的log級(jí)別
level 內(nèi)核級(jí)別(0-7)
init.rc文件中的7行 :
loglevel 6
:
所有命令的執(zhí)行函數(shù)
所有動(dòng)作、服務(wù)、命令和選項(xiàng)列表
服務(wù)(Service)
-------------
:
service <name> <pathname> [argument ...]
<option>
... >
<option>
name
rc腳本中必須唯一
pathname [argument ...]
帶路徑的服務(wù)程序名及參數(shù)
option
說(shuō)明服務(wù)的選項(xiàng)
選項(xiàng)(Options)
-------------
:
critical
4分鐘之內(nèi)重啟了4次該服務(wù),重啟Android系統(tǒng)進(jìn)入recovery模式
disabled
服務(wù)不能使用start_class命令啟動(dòng),必須通過(guò)服務(wù)名稱啟動(dòng)
setenv <name> <value>
設(shè)置環(huán)境變量,并且將其做為服務(wù)進(jìn)程的環(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和seqpacket
dgram 無(wú)序報(bào)文傳送,不保證可靠
seqpacket 順序報(bào)文傳送,不保證可靠
stream 流傳送,保證可靠
perm 指定權(quán)限(八進(jìn)制的數(shù)表示)
user 指定所屬用戶, 默認(rèn)root用戶
group 指定所屬主,默認(rèn)root組
user <username>
指定服務(wù)進(jìn)程所屬用戶,默認(rèn)root
username 用戶名
group <groupname> [groupname] [...]
默認(rèn)root
groupname 組名
oneshot
服務(wù)進(jìn)程退出時(shí),不重啟
class <name>
指定服務(wù)所屬類,這樣可以使用class_start命令啟動(dòng)同一類的多個(gè)服務(wù)
如果沒有指定,服務(wù)屬于默認(rèn)(default)類
name 類名
onrestart <command>
服務(wù)重啟時(shí),運(yùn)行指定程序
command 命令及其參數(shù)
例:在init.rc和init.sun5i.rc中尋找
調(diào)試注意:默認(rèn)Android系統(tǒng)會(huì)將進(jìn)程的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤重定位到/dev/null(沒有設(shè)置console)或/dev/console(有設(shè)置console)
如果想看到進(jìn)程輸出,請(qǐng)使用logwrapper程序啟動(dòng)進(jìn)程,如:
service akmd /system/bin/logwrapper /sbin/akmd
Properties
----------
init進(jìn)程的屬性值,使別的進(jìn)程可以看到init進(jìn)程當(dāng)前的運(yùn)行狀態(tài):
init.action
init進(jìn)程當(dāng)前正在執(zhí)行的動(dòng)作的名稱
init.command
init進(jìn)程當(dāng)前正在執(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)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!