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