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目錄)