Android 10 啟動分析之init語法詳解
正文
init.rc腳本包含5種類型,Action(動作),Commands(命令), Services(服務(wù)),Options(選項), Imports(導(dǎo)入)。
以上這些都是基于“行”來解析的,并且用空格隔開關(guān)鍵字。
如果關(guān)鍵字中有空格,處理方法類似于C語言,使用/表示轉(zhuǎn)義,使用""防止關(guān)鍵字被斷開,另外需要注意/在末尾表示換行。
#開頭表示注釋。
可以使用語法 ${propertiesty.name}展開系統(tǒng)屬性。這也適用于需要連接的上下文,如import /init.Recovery.${ro.hardware}.rc
。
當(dāng)聲明一個service或者action的時候,它將隱式聲明一個section,它之后跟隨的command或者option都將屬于這個section。
Service的名稱要保持唯一性。如果使用與現(xiàn)有Service相同的名稱定義了第二個Service,則將忽略該Service并記錄錯誤消息。
Actions
Action 指的是在某種條件下觸發(fā)一系列的命令,通常有一個Trigger,用于確定何時執(zhí)行操作。當(dāng)與Action的Trigger匹配的事件發(fā)生時,該Action將被添加到待執(zhí)行隊列的尾部(除非它已經(jīng)在隊列上)。
Action的形式如下所示:
on <trigger> [&& <trigger>]* <command> <command> <command>
Services
Services在特定選項的約束下被init程序運行或者重啟,Service的格式如下所示:
service <name> <pathname> [ <argument> ]* <option> <option> ...
參數(shù)解釋:
- name 表示此service的名稱
- pathname 此service所在路徑。
- argument 啟動service所帶的參數(shù)
- option 對此service的約束選項。
Options
Options是Services的修飾符。它們影響init運行Services的方式和時機。
class <name> [ <name>\* ]
為該服務(wù)指定一個class名,同一個class的所有服務(wù)必須同時自動或者停止,默認情況下服務(wù)的class名是"default" 。
console [<console>]
這個Service需要一個控制臺??蛇x的第二個參數(shù)選擇一個特定的控制臺,而不是默認的。可以通過設(shè)置androidboot.sole
內(nèi)核參數(shù)來更改默認的/dev/console
。在所有情況下,都應(yīng)該省略前面的/dev/
,因此/dev/tty0
將被寫作console tty0
。
critical
表明這個Service對設(shè)備至關(guān)重要,如果Service在四分鐘內(nèi)退出超過4次,則設(shè)備將重啟進入恢復(fù)模式。
disabled
此Service不會自動啟動,需要通過顯示調(diào)用Service名稱來啟動。
file <path> <type>
打開文件路徑并將其FD傳遞給啟動進程。類型必須是“r”、“w”或“RW”。
group <groupname> [ <groupname>\* ]
在啟動服務(wù)將用戶組切換至<groupname>
keycodes <keycode> [ <keycode>\* ]
設(shè)置將觸發(fā)此服務(wù)的Keycodes。如果同時按下與傳遞的Keycodes對應(yīng)的所有鍵,則服務(wù)將啟動。這通常用于啟動bugreport服務(wù)。
oneshot
當(dāng)此Service退出時,不要主動去重啟它。
onrestart
在重啟時執(zhí)行一條命令。
oom_score_adjust <value>
將子程序的/proc/Self/oom_Score_adj
設(shè)置為指定的值,該值必須在-1000到1000之間。
override
指示此Service用于覆蓋先前定義的具有相同名稱的Service。
priority <priority>
Service進程的調(diào)度優(yōu)先級。此值必須在-20到19之間。默認優(yōu)先級為0。
restart_period <seconds>
如果一個non-oneshot Service退出,它將在其啟動時間的基礎(chǔ)上加上這段時間后再重新啟動,默認5s。對于打算定期運行的服務(wù),可以增加此值。例如,它可以設(shè)置為3600表示服務(wù)應(yīng)該每小時運行一次,或者86400表示服務(wù)應(yīng)該每天運行。
setenv <name> <value>
設(shè)置啟動環(huán)境變量。
shutdown <shutdown_behavior>
設(shè)置Service進程的關(guān)閉行為。如果未指定此操作,則通過SIGTERM和SIGKILL關(guān)閉Service進程。在關(guān)機期間,shutdown_behavior為“critical”的Service在shutdown超時之前不會被關(guān)閉。當(dāng)shutdown超時時,即使標記為“shutdown critical”的Service也將被關(guān)閉。當(dāng)執(zhí)行shut down操作時,標記為“shutdown critical”的服務(wù)如果沒有運行,它將被啟動。
socket <name> <type> <perm> [ <user> [ <group> [ <seclabel> ] ] ]
創(chuàng)建一個名為/dev/Socket/name的Unix域套接字,并將其FD傳遞給啟動進程。類型必須是“dgram”、“stream”或“seqPacket”。用戶和組默認為0。“secLabel”是套接字的SELinux安全上下文。
user <username>
表示將用戶切換為<username>,當(dāng)前默認為root。
Triggers
Triggers是可用于匹配某些類型的事件,并觸發(fā)一個Action的字符串。
Triggers被細分為Event triggers
和Property triggers
。
Event triggers
是由init可執(zhí)行文件中的trigger
命令或QueueEventTrigger()
函數(shù)觸發(fā)的字符串。它們的形式是一個簡單的字符串,比如boot
或late-init
。
Property triggers
是命名屬性將值更改為給定的新值或命名屬性將值更改為任何新值時觸發(fā)的字符串。它們分別以Property:<name><value>
和Property:<name>=*
的形式出現(xiàn)。Property triggers
還會在init的初始啟動階段被觸發(fā)。
一個Action可以有多個Property triggers
,但可能只有一個Event triggers
。
例如:
onboot&&properties:a=b
定義了一個只有當(dāng)boot
Event triggers
發(fā)生并且屬性a等于b時才執(zhí)行的Action
。
on property:a=b && property:c=d
定義了一個執(zhí)行三次的Action
:
- 在 initial boot 期間, 如果 property a=b 且 property c=d。
- 當(dāng)property c已經(jīng)等于d時,property a轉(zhuǎn)換為b值。
- 當(dāng)property a已經(jīng)等于b時,property c轉(zhuǎn)換為d值。
Commands
bootchart [start|stop]
start or stop bootchart,bootchart是用于記錄開機時進程啟動時間的工具。
chmod <octal-mode> <path>
更改文件訪問權(quán)限。
chown <owner> <group> <path>
更改文件所有者和組。
class_start <serviceclass>
如果指定類的Service尚未運行,則啟動它們。
class_stop <serviceclass>
如果指定類的Service正在運行,則停止并禁用它們。
class_reset <serviceclass>
如果指定類的Service正在運行,則停止它們,但是不禁用它們。它們可以使用class_start重新啟動。
class_restart <serviceclass>
重新啟動指定類的Service。
copy <src> <dst>
復(fù)制一份文件。通常用于二進制/大數(shù)據(jù)文件。
enable <servicename>
將disable的Service轉(zhuǎn)換為enable的Service。如果Service應(yīng)該被執(zhí)行,它將立即啟動。
exec [ <seclabel> [ <user> [ <group>\* ] ] ] -- <command> [ <argument>\* ]
用給定的參數(shù)fork并執(zhí)行command。在這個command完成之前,不會運行其他命令。SecLabel可以用-來表示默認值。
mkdir <path> [mode] [owner] [group]
在PATH上創(chuàng)建一個目錄,默認權(quán)限為755,并由root用戶和root組擁有。
restart <service>
重啟正在運行的Service。
start <service>
如果Service尚未運行,則啟動該Service。請注意,這是異步的操作。
trigger <event>
觸發(fā)一個Event。
write <path> <content>
打開路徑為PATH的文件,并使用write()向其寫入一個字符串。如果該文件不存在,則將創(chuàng)建該文件。
Imports
import <path>
解析init配置文件,擴展當(dāng)前配置。如果PATH是一個目錄,則該目錄中的每個文件都被解析為一個配置文件,但它不是遞歸操作,嵌套目錄不會被解析。
以上就是Android 10 啟動分析之init語法詳解的詳細內(nèi)容,更多關(guān)于Android 10 啟動init語法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
13問13答全面學(xué)習(xí)Android View繪制
這篇文章主要為大家詳細介紹了Android View繪制,13問13答幫助大家全面學(xué)習(xí)Android View繪制,感興趣的小伙伴們可以參考一下2016-03-03基于android中的各種顏色在drawable.xml中的值詳解
本篇文章是對在android中的各種顏色在drawable.xml中的值進行了詳細的介紹。需要的朋友參考下2013-05-05flutter自定義InheritedProvider實現(xiàn)狀態(tài)管理詳解
這篇文章主要為大家介紹了flutter自定義InheritedProvider實現(xiàn)狀態(tài)管理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11Android之禁止ViewPager滑動實現(xiàn)實例
這篇文章主要介紹了Android之禁止ViewPager滑動實現(xiàn)實例的相關(guān)資料,需要的朋友可以參考下2017-05-05