網站首頁 編程語言 正文
正文
init.rc腳本包含5種類型,Action(動作),Commands(命令), Services(服務),Options(選項), Imports(導入)。
以上這些都是基于“行”來解析的,并且用空格隔開關鍵字。
如果關鍵字中有空格,處理方法類似于C語言,使用/表示轉義,使用""防止關鍵字被斷開,另外需要注意/在末尾表示換行。
#開頭表示注釋。
可以使用語法 ${propertiesty.name}展開系統屬性。這也適用于需要連接的上下文,如import /init.Recovery.${ro.hardware}.rc
。
當聲明一個service或者action的時候,它將隱式聲明一個section,它之后跟隨的command或者option都將屬于這個section。
Service的名稱要保持唯一性。如果使用與現有Service相同的名稱定義了第二個Service,則將忽略該Service并記錄錯誤消息。
Actions
Action 指的是在某種條件下觸發一系列的命令,通常有一個Trigger,用于確定何時執行操作。當與Action的Trigger匹配的事件發生時,該Action將被添加到待執行隊列的尾部(除非它已經在隊列上)。
Action的形式如下所示:
on <trigger> [&& <trigger>]* <command> <command> <command>
Services
Services在特定選項的約束下被init程序運行或者重啟,Service的格式如下所示:
service <name> <pathname> [ <argument> ]* <option> <option> ...
參數解釋:?
- name 表示此service的名稱?
- pathname 此service所在路徑。?
- argument 啟動service所帶的參數?
- option 對此service的約束選項。
Options
Options是Services的修飾符。它們影響init運行Services的方式和時機。
class <name> [ <name>\* ]
為該服務指定一個class名,同一個class的所有服務必須同時自動或者停止,默認情況下服務的class名是"default" 。
console [<console>]
這個Service需要一個控制臺。可選的第二個參數選擇一個特定的控制臺,而不是默認的。可以通過設置androidboot.sole
內核參數來更改默認的/dev/console
。在所有情況下,都應該省略前面的/dev/
,因此/dev/tty0
將被寫作console tty0
。
critical
表明這個Service對設備至關重要,如果Service在四分鐘內退出超過4次,則設備將重啟進入恢復模式。
disabled
此Service不會自動啟動,需要通過顯示調用Service名稱來啟動。
file <path> <type>
打開文件路徑并將其FD傳遞給啟動進程。類型必須是“r”、“w”或“RW”。
group <groupname> [ <groupname>\* ]
在啟動服務將用戶組切換至<groupname>
keycodes <keycode> [ <keycode>\* ]
設置將觸發此服務的Keycodes。如果同時按下與傳遞的Keycodes對應的所有鍵,則服務將啟動。這通常用于啟動bugreport服務。
oneshot
當此Service退出時,不要主動去重啟它。
onrestart
在重啟時執行一條命令。
oom_score_adjust <value>
將子程序的/proc/Self/oom_Score_adj
設置為指定的值,該值必須在-1000到1000之間。
override
指示此Service用于覆蓋先前定義的具有相同名稱的Service。
priority <priority>
Service進程的調度優先級。此值必須在-20到19之間。默認優先級為0。
restart_period <seconds>
如果一個non-oneshot Service退出,它將在其啟動時間的基礎上加上這段時間后再重新啟動,默認5s。對于打算定期運行的服務,可以增加此值。例如,它可以設置為3600表示服務應該每小時運行一次,或者86400表示服務應該每天運行。
setenv <name> <value>
設置啟動環境變量。
shutdown <shutdown_behavior>
設置Service進程的關閉行為。如果未指定此操作,則通過SIGTERM和SIGKILL關閉Service進程。在關機期間,shutdown_behavior為“critical”的Service在shutdown超時之前不會被關閉。當shutdown超時時,即使標記為“shutdown critical”的Service也將被關閉。當執行shut down操作時,標記為“shutdown critical”的服務如果沒有運行,它將被啟動。
socket <name> <type> <perm> [ <user> [ <group> [ <seclabel> ] ] ]
創建一個名為/dev/Socket/name的Unix域套接字,并將其FD傳遞給啟動進程。類型必須是“dgram”、“stream”或“seqPacket”。用戶和組默認為0。“secLabel”是套接字的SELinux安全上下文。
user <username>
表示將用戶切換為<username>,當前默認為root。
Triggers
Triggers是可用于匹配某些類型的事件,并觸發一個Action的字符串。
Triggers被細分為Event triggers
和Property triggers
。
Event triggers
是由init可執行文件中的trigger
命令或QueueEventTrigger()
函數觸發的字符串。它們的形式是一個簡單的字符串,比如boot
或late-init
。
Property triggers
是命名屬性將值更改為給定的新值或命名屬性將值更改為任何新值時觸發的字符串。它們分別以Property:<name><value>
和Property:<name>=*
的形式出現。Property triggers
還會在init的初始啟動階段被觸發。
一個Action可以有多個Property triggers
,但可能只有一個Event triggers
。
例如:
onboot&&properties:a=b
定義了一個只有當boot
Event triggers
發生并且屬性a等于b時才執行的Action
。
on property:a=b && property:c=d
?定義了一個執行三次的Action
:
- 在 initial boot 期間, 如果 property a=b 且 property c=d。
- 當property c已經等于d時,property a轉換為b值。
- 當property a已經等于b時,property c轉換為d值。
Commands
bootchart [start|stop]
start or stop bootchart,bootchart是用于記錄開機時進程啟動時間的工具。
chmod <octal-mode> <path>
更改文件訪問權限。
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>
復制一份文件。通常用于二進制/大數據文件。
enable <servicename>
將disable的Service轉換為enable的Service。如果Service應該被執行,它將立即啟動。
exec [ <seclabel> [ <user> [ <group>\* ] ] ] -- <command> [ <argument>\* ]
用給定的參數fork并執行command。在這個command完成之前,不會運行其他命令。SecLabel可以用-來表示默認值。
mkdir <path> [mode] [owner] [group]
在PATH上創建一個目錄,默認權限為755,并由root用戶和root組擁有。
restart <service>
重啟正在運行的Service。
start <service>
如果Service尚未運行,則啟動該Service。請注意,這是異步的操作。
trigger <event>
觸發一個Event。
write <path> <content>
打開路徑為PATH的文件,并使用write()向其寫入一個字符串。如果該文件不存在,則將創建該文件。
Imports
import <path>
解析init配置文件,擴展當前配置。如果PATH是一個目錄,則該目錄中的每個文件都被解析為一個配置文件,但它不是遞歸操作,嵌套目錄不會被解析。
原文鏈接:https://juejin.cn/post/6998441504364560420/
相關推薦
- 2022-11-11 C語言qsort函數使用方法詳解_C 語言
- 2023-01-18 fastadmin使用學習中的常見問題匯總_其它CMS
- 2022-06-17 Go語言HttpRouter路由使用方法詳解_Golang
- 2022-04-06 C++的友元和內部類你了解嗎_C 語言
- 2022-05-22 Nginx反向代理與負載均衡概念理解及模塊使用_nginx
- 2022-05-11 Restful的Get請求參數為List
- 2023-03-17 Python導入Excel表格數據并以字典dict格式保存的操作方法_python
- 2022-07-22 String類的matches()方法的使用
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支