init.rc解析與chmod 改變檔案屬性沒用
轉自:http://h1372865100.blog.163.com/blog/static/2104291032012929114132327/ android的init.rc文法是專屬的,可以說是一種語言吧。
init.rc的文法分為行為(Actions),、命令(Commands) 、服務(Services)、選項(Options)。
類別 |
名稱 |
描述 |
SECTION |
on |
觸發條件 |
同上.. |
service |
解析service |
COMMAND |
chdir |
更改當前工作目錄 |
同上.. |
chroot |
更改參考的根目錄位置 |
.. |
class_start |
啟動某個設定了class名稱的服務 |
.. |
class_stop |
停止某個設定了class名稱的服務 |
.. |
domainname |
網域名稱 |
.. |
exec |
調用程式並轉移進程 |
.. |
export |
提交變數 |
.. |
hostname |
主機名稱 |
.. |
ifup |
啟用網卡 |
.. |
insmod |
掛載模組 |
.. |
import |
引入配置,比如etc下的一些rc檔案,和java中的import差不多 |
.. |
mkdir |
建立目錄 |
.. |
mount |
掛載檔案系統 |
.. |
setkey |
從源碼看,應該是設定一個命令的關鍵字縮寫,比如可以將domainname映射為dn |
.. |
setprop |
設定一個屬性 |
.. |
setrlimit |
設定當前程式可以開啟的最大檔案數到系統規定程式可以開啟的最大檔案數 |
.. |
start |
啟動服務 |
.. |
stop |
停止服務 |
.. |
trigger |
不清楚,難道是自訂觸發器。 |
.. |
symlink |
建立符號連結 |
.. |
sysclktz |
設定基準時間 |
.. |
wait |
等待檔案準備好。Linux中這是進程調度的函數 |
.. |
write |
向檔案、裝置寫個什麼東西。肯定不是傳訊息的那個wirte |
.. |
copy |
不解釋 |
.. |
chown |
更改所有者 |
.. |
chmod |
更改許可權 |
.. |
loglevel |
Log輸出層級,低於這個層級的就輸出 |
.. |
restart |
重啟服務 |
OPTION |
capability |
能力,也就是系統對進程的一種許可權控制。 |
同上.. |
class |
設定class name |
.. |
console |
啟用控制台 |
.. |
critical |
是否關鍵,也就是4分鐘之內重啟超過4次的話,重啟之後就進入recovery模式 |
.. |
disabled |
不隨class自動啟動 |
.. |
group |
組歸屬 |
.. |
keycodes |
不明白。。。。。 |
.. |
oneshot |
只啟動一次,意外退出後不必重啟 |
.. |
onrestart |
重啟時 |
.. |
setenv |
增加環境變數 |
.. |
socket |
申請socket資源 |
.. |
user |
使用者歸屬 |
.. |
ioprio |
io調度優先順序 |
(很多屬性與命令用法都與linux中同名命令差球不多)
init是分段(section)解析init.rc的,在keywords.h中可以查看關鍵字的定義。init是以什麼標誌來分段解析init.rc呢。結合init.rc的內容,可以看出,分區段標記是以on 和 service來標記的。下面詳細說明。
on 啥時候幹什麼
on屬於行為。
on early-init
init之前、載入完所有rc檔案後即執行,在miui的rom中,init.rc在early-init執行的是start ueventd,根據keywords.h的定義,start是個命令(COMMAND)。
這裡順便說下ueventd,android中底層(一般指驅動)通知上層的事件,用的是uevent,java層通過觀察者模式實現,用到的類為 UEventObserver,使用intent來傳遞;native層用的是android_os_UEventObserver.cpp,使用uevent.c通過socket傳遞。當然,這是framework及以下的層面,一般開發不經常用到,更何況這幾個類都沒有被暴露出來。
on init
載入propety各項屬性檔案之前執行,在init變為propety service之前都屬於init階段。
on early-boot
啟動屬性service後即執行。
on boot
boot的時候執行。
on property:xxxxx=x
當某個屬性設定為預期值時執行。
關於init.rc,其實結合/src/system/core/init/* 源碼和init.rc檔案來看,會明白許多。
=========
有時需要添加你自己增加的檔案到root的時候,然後在init.rc修改檔案的屬性探索沒有用,我也是折騰了半天,在網上看到有一個文章:
create a script somewhere, for example, /system/bin/mymod.rc
#!/system/bin/sh
chmod 0777 /dev/mynode
add the following in /init.rc:
service mymod /system/bin/mymod.rc
oneshot
(注意表添加錯了位置/system/bin/,是組建檔案系統的system目錄,不是root下的system目錄)