Android init.rc文件詳解及簡單實(shí)例
Android init.rc文件詳解
本文主要來自$ANDROID_SOURCE/system/init/readme.txt的翻譯.
1 簡述
Android init.rc文件由系統(tǒng)第一個啟動的init程序解析,此文件由語句組成,主要包含了四種類型的語句:Action,Commands,Services,Options.在init.rc文件中一條語句通常是占據(jù)一行.單詞之間是通過空格符來相隔的.如果需要在單詞內(nèi)使用空格,那么得使用轉(zhuǎn)義字符"\",如果在一行的末尾有一個反斜杠,那么是換行折疊符號,應(yīng)該和下一行合并成一起來處理,這樣做主要是為了避免一行的字符太長,與C語言中的含義是一致的。注釋是以#號開頭。 Action和services顯式聲明了一個語句塊,而commands和options屬于最近聲明的語句塊。在第一個語句塊之前 的commands和options會被忽略.
在具體講解這之前,有些關(guān)鍵詞得先了解.
2 關(guān)鍵字
token: 計算機(jī)語言中的一個單詞,就跟英文中的單詞差不多一人概念.
Section: 語句塊,相當(dāng)于C語言中大括號內(nèi)的一個塊。一個Section以Service或On開頭的語句塊.以Service開頭的Section叫做服務(wù),而以O(shè)n開頭的叫做動作(Action).
services: 服務(wù).
Action: 動作
commands:命令.
options:選項(xiàng).
trigger:觸發(fā)器,或者叫做觸發(fā)條件.
class: 類屬,即可以為多個service指定一個相同的類屬,方便操作同時啟動或停止.
3 語句解析
3.1 動作(Action)
動作表示了一組命令(commands)組成.動作包含一個觸發(fā)器,決定了何時執(zhí)行這個動作。當(dāng)觸發(fā)器的條件滿足時,這個動作會被加入到已被執(zhí)行的隊列尾。如果此動作在隊列中已經(jīng)存在,那么它將不會執(zhí)行.
一個動作所包含的命令將被依次執(zhí)行。動作的語法如下所示:
on <trigger> <command> <command> <command>
3.2 服務(wù)(services)
服務(wù)是指那些需要在系統(tǒng)初始化時就啟動或退出時自動重啟的程序.
它的語法結(jié)構(gòu)如下所示:
service <name> <pathname> [ <argument> ]* <option> <option> ...
3.3 選項(xiàng)(options)
選項(xiàng)是用來修改服務(wù)的。它們影響如何及何時運(yùn)行這個服務(wù).
| 選項(xiàng) | 描述 |
| critical | 據(jù)設(shè)備相關(guān)的關(guān)鍵服務(wù),如果在4分鐘內(nèi),此服務(wù)重復(fù)啟動了4次,那么設(shè)備將會重啟進(jìn)入還原模式。 |
| disabled | 服務(wù)不會自動運(yùn)行,必須顯式地通過服務(wù)器來啟動。 |
| setenv <name> <value> | 設(shè)置環(huán)境變量 |
| socket <name> <type> <perm> [ <user> [ <group> ] ] | 在/dev/socket/下創(chuàng)建一個unix domain的socket,并傳遞創(chuàng)建的文件描述符fd給服務(wù)進(jìn)程.其中type必須為dgram或stream,seqpacket.用戶名和組名默認(rèn)為0 |
| user <username> | 在執(zhí)行此服務(wù)之前先切換用戶名。當(dāng)前默認(rèn)為root. |
| group <groupname> [ <groupname> ]* | 類似于user,切換組名 |
| oneshot | 當(dāng)此服務(wù)退出時不會自動重啟. |
| class <name> | 給服務(wù)指定一個類屬,這樣方便操作多個服務(wù)同時啟動或停止.默認(rèn)情況下為default. |
| onrestart | 當(dāng)服務(wù)重啟時執(zhí)行一條指令, |
3.4 觸發(fā)器(trigger)
觸發(fā)器用來描述一個觸發(fā)條件,當(dāng)這個觸發(fā)條件滿足時可以執(zhí)行動作.
| 觸發(fā)器 | 描述 |
| boot | 當(dāng)init程序執(zhí)行,并載入/init.conf文件時觸發(fā). |
| <name>=<value> | 當(dāng)屬性名對應(yīng)的值設(shè)置為指定值時觸發(fā). |
| device-added-<path> | 當(dāng)添加設(shè)備時觸發(fā). |
| device-removed-<path> | 當(dāng)設(shè)備移除時觸發(fā). |
| service-exited-<name> | 當(dāng)指定的服務(wù)退出時觸發(fā). |
3.5 命令(commands)
| 命令 | 描述 |
| exec <path> [ <argument> ]* |
執(zhí)行指定路徑下的程序,并傳遞參數(shù). |
| export <name> <value> | 設(shè)置全局環(huán)境參數(shù),此參數(shù)被設(shè)置后對所有進(jìn)程都有效. |
| ifup <interface> | 使指定的網(wǎng)絡(luò)接口"上線",相當(dāng)激活指定的網(wǎng)絡(luò)接口 |
| import <filename> | 導(dǎo)入一個額外的init配置文件. |
| hostname <name> | 設(shè)置主機(jī)名 |
| chdir <directory> | 改變工作目錄. |
| chmod <octal-mode> <path> | 改變指定文件的讀取權(quán)限. |
| chown <owner> <group> <path> | 改變指定文件的擁有都和組名的屬性. |
| chroot <directory> | 改變進(jìn)行的根目錄. |
| class_start <serviceclass> | 啟動指定類屬的所有服務(wù),如果服務(wù)已經(jīng)啟動,則不再重復(fù)啟動. |
| class_stop <serviceclass> | 停止指定類屬的所胡服務(wù). |
| domainname <name> | 設(shè)置域名 |
| insmod <path> | 安裝模塊到指定路徑. |
| mkdir <path> [mode] [owner] [group] | 用指定參數(shù)創(chuàng)建一個目錄,在默認(rèn)情況下,創(chuàng)建的目錄讀取權(quán)限為755.用戶名為root,組名為root. |
| mount <type> <device> <dir> [ <mountoption> ]* | 類似于linux的mount指令 |
| setkey | TBD(To Be Determined),待定. |
| setprop <name> <value> | 設(shè)置屬性及對應(yīng)的值. |
| setrlimit <resource> <cur> <max> | 設(shè)置資源的rlimit(資源限制),不懂就百度一下rlimit |
| start <service> | 如果指定的服務(wù)未啟動,則啟動它. |
| stop <service> | 如果指定的服務(wù)當(dāng)前正在運(yùn)行,則停止它. |
| symlink <target> <path> | 創(chuàng)建一個符號鏈接. |
| sysclktz <mins_west_of_gmt> | 設(shè)置系統(tǒng)基準(zhǔn)時間. |
| trigger <event> | Trigger an event. Used to queue an action from another action.這名話沒有理解,望高手指點(diǎn). |
| write <path> <string> [ <string> ]* | 往指定的文件寫字符串. |
3.6 屬性(Properties)
| 屬性名 | 描述 |
| init.action | 當(dāng)前正在執(zhí)行的動作,如果沒有則為空字符串"" |
| init.command | 當(dāng)前正在執(zhí)行的命令.沒有則為空字符串. |
| init.svc.<name> | 當(dāng)前某個服務(wù)的狀態(tài),可為"stopped", "running", "restarting" |
4 一個 init.conf例子
# not complete -- just providing some examples of usage # on boot export PATH /sbin:/system/sbin:/system/bin export LD_LIBRARY_PATH /system/lib mkdir /dev mkdir /proc mkdir /sys mount tmpfs tmpfs /dev mkdir /dev/pts mkdir /dev/socket mount devpts devpts /dev/pts mount proc proc /proc mount sysfs sysfs /sys write /proc/cpu/alignment 4 ifup lo hostname localhost domainname localhost mount yaffs2 mtd@system /system mount yaffs2 mtd@userdata /data import /system/etc/init.conf class_start default service adbd /sbin/adbd user adb group adb service usbd /system/bin/usbd -r user usbd group usbd socket usbd 666 service zygote /system/bin/app_process -Xzygote /system/bin --zygote socket zygote 666 service runtime /system/bin/runtime user system group system on device-added-/dev/compass start akmd on device-removed-/dev/compass stop akmd service akmd /sbin/akmd disabled user akmd group akmd
5 調(diào)試注意事項(xiàng)
在默認(rèn)情況下,通過init程序啟動的程序的標(biāo)準(zhǔn)輸出stdout和標(biāo)準(zhǔn)錯誤輸出stderr會重定向到/dev/null.如:
service akmd /system/bin/logwrapper /sbin/akmd
為了更方便調(diào)試你的程序,你可以使用Android的log系統(tǒng),標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出會重定義到Android的log系統(tǒng)中來.
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Android SQLite數(shù)據(jù)庫進(jìn)行查詢優(yōu)化的方法
這篇文章主要給大家介紹了關(guān)于Android SQLite數(shù)據(jù)庫進(jìn)行查詢優(yōu)化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
Android 通過Base64上傳圖片到服務(wù)器實(shí)現(xiàn)實(shí)例
這篇文章主要介紹了Android 通過Base64上傳圖片到服務(wù)器實(shí)現(xiàn)實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05
Android實(shí)現(xiàn)手勢控制ImageView圖片大小
這篇文章主要介紹了Android實(shí)現(xiàn)手勢控制ImageView圖片大小的相關(guān)資料,需要的朋友可以參考下2016-02-02
Android開發(fā)可添加頭尾的RecycleView的實(shí)現(xiàn)
這篇文章主要為大家介紹了Android開發(fā)可添加頭尾的RecycleView的實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Android實(shí)現(xiàn)自動填充短信驗(yàn)證碼
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)自動填充短信驗(yàn)證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05
Android自定義View實(shí)現(xiàn)圓環(huán)交替效果
這篇文章給大家介紹如何基于Android自定義View實(shí)現(xiàn)圓環(huán)交替的效果,實(shí)現(xiàn)后效果很贊,有需要的小伙伴們可以參考借鑒。2016-08-08

