日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Android?10?啟動分析之init語法詳解_Android

作者:格子里的夢 ? 更新時間: 2022-11-22 編程語言

正文

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 triggersProperty triggers

Event triggers是由init可執行文件中的trigger命令或QueueEventTrigger()函數觸發的字符串。它們的形式是一個簡單的字符串,比如bootlate-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> [ &lt;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/

欄目分類
最近更新