Android init 腳本語言說明

android 官方說明

概述

Android Init 語言由四大類語句組成,它們是 Actions、Commands、Services 和 Options。

所有這些都是面向行的,由空格分隔的標(biāo)記組成。 c 樣式的反斜杠轉(zhuǎn)義可用于將空格插入到標(biāo)記中。 雙引號也可用于防止空格將文本分成多個標(biāo)記。 反斜杠,當(dāng)它是一行的最后一個字符時,可以用于換行。

以 # 開頭的行(允許前導(dǎo)空格)是注釋。

Actions 和 Services 隱式聲明了一個新部分。 所有Commands或Options都屬于最近聲明的部分。 第一部分之前的Commands或Options將被忽略。

Actions 和Services 具有唯一的名稱。 如果第二個 Action 或 Service 被聲明為與現(xiàn)有的同名,則將其作為錯誤忽略。 (???我們應(yīng)該覆蓋而不是)

Actions

Actions 是命名的命令序列。 Actions 有一個觸發(fā)器,用于確定動作何時發(fā)生。 當(dāng)發(fā)生與Actions 的觸發(fā)器匹配的事件時,該Actions 將添加到待執(zhí)行隊列的尾部(除非它已經(jīng)在隊列中)。

隊列中的每個 action 都按順序出隊,并且該動作中的每個命令都按順序執(zhí)行。 Init 在活動中的命令執(zhí)行“之間”處理其他活動(設(shè)備創(chuàng)建/銷毀、屬性設(shè)置、進(jìn)程重 啟)。

命令采取以下形式:

on <trigger>
   <command>
   <command>
   <command>

Services

服務(wù)是在它們退出時啟動并(可選)重新啟動的程序。
服務(wù)采取以下形式:

service <name> <pathname> [ <argument> ]*
   <option>
   <option>
   ...

Options

選項是服務(wù)的調(diào)節(jié)器。他們影響init進(jìn)程如何并且何時運行這個服務(wù)。

 critical
    這是一個設(shè)備關(guān)鍵服務(wù)。如果他在四分鐘內(nèi)存在超過四次,設(shè)備將會重啟進(jìn)入恢復(fù)模式。
  
  disabled
    這個服務(wù)將不能與他的類自動啟動。他必須通過名稱被顯示啟動。
  
  setenv <名稱> <值>
    在啟動進(jìn)程中設(shè)置環(huán)境變量<名稱>到<數(shù)值>
  
 socket <name> <type> <perm> [ <user> [ <group> [ <seclabel> ] ] ]
   創(chuàng)建一個unix域套接字,命名為 /dev/socket/<name>,并且傳遞他的文件描述符fd到啟動進(jìn)程中。
   <type>必須是"dgram","stream"或者是"seqpacket"。
   User和group默認(rèn)為0。
   'seclabel'是這個套接字的SELinux安全上下文。
   他默認(rèn)為服務(wù)安全上下文,由seclabel指定或者是基于服務(wù)可執(zhí)行文件安全上下文計算得來。
 
 user <username>
   在運行這個服務(wù)之前改為username(用戶名稱)。
   當(dāng)前默認(rèn)為root.目前,如果你的進(jìn)程需要linux功能,那么你不能使用這個命令。你必須在進(jìn)程中
   請求功能但依然root,然后降級到你期望的uid。
 
 group <groupname> [ <groupname> ]*
   在運行這個服務(wù)之前修改為groupname。在第一個之前的組名稱被用來設(shè)置進(jìn)程的追加的組(通過setgrooups())
   。目前默認(rèn)為root。
 
 seclabel <seclabel>
   在執(zhí)行這個服務(wù)之前改為seclabel。主要是從rootfs等中被services使用。
   位于系統(tǒng)分區(qū)的services可以基于他們的文件安全上下文使用策略定義的轉(zhuǎn)換。
   如果未被指定或者是在策略中沒有轉(zhuǎn)換被定義,默認(rèn)為初始化上下文。
 
 oneshot
   當(dāng)他退出的時候不要重啟服務(wù)。
 
 class <name>
   為服務(wù)指定一個類名稱。位于一個命名的類中的所有服務(wù)一起被啟動或停止。
   如果服務(wù)未被class選項指定,則該服務(wù)位于類'default'中。
 
 onrestart
   當(dāng)services重啟的時候運行一個命令。
 
 writepid <file...>
   當(dāng)子進(jìn)程被創(chuàng)建的時候,將子進(jìn)程的pid寫入到給定的文件中。意味著cgroup/cpuset
   用法。

觸發(fā)器

觸發(fā)器是可用于匹配某些類型的字符串
事件并用于導(dǎo)致動作發(fā)生。

boot
這是 init 啟動時將發(fā)生的第一個觸發(fā)器
(在 /init.conf 加載后)

<name>=<value>
設(shè)置屬性 <name> 時會發(fā)生這種形式的觸發(fā)器
到特定值 <value>。

device-added-<path>
device-removed-<path></pre>
添加設(shè)備節(jié)點時會發(fā)生這些形式的觸發(fā)器
或刪除。

service-exited-<name>
這種形式的觸發(fā)器在指定的服務(wù)退出時發(fā)生。

示例:

on boot
# basic network init
    ifup lo
    hostname localhost
    domainname localdomain

# set RLIMIT_NICE to allow priorities from 19 to -20
    setrlimit 13 40 40

# Define the oom_adj values for the classes of processes that can be
# killed by the kernel.  These are used in ActivityManagerService.
    setprop ro.FOREGROUND_APP_ADJ 0
    setprop ro.VISIBLE_APP_ADJ 1
...

命令

exec <path> [ <argument> ]*
   fork 并執(zhí)行一個程序 (<path>)。這將阻塞直到
   程序完成執(zhí)行。最好避免執(zhí)行
   與內(nèi)置命令不同,它冒著獲取的風(fēng)險
   初始化“卡住”。 (???也許應(yīng)該有一個超時?)

export <name> <value>
   將環(huán)境變量 <name> 設(shè)置為等于 <value> 在
   全局環(huán)境(將被所有進(jìn)程繼承
   此命令執(zhí)行后啟動)

ifup <interface>
   使網(wǎng)絡(luò)接口 <interface> 聯(lián)機。

import <filename>
   解析一個初始化配置文件,擴(kuò)展當(dāng)前配置。

hostname <name>
   設(shè)置主機名。

chdir <directory>
   更改工作目錄。

chmod <octal-mode> <path>
   更改文件訪問權(quán)限。

chown <owner> <group> <path>
   更改文件所有者和組。

chroot <directory>
  更改進(jìn)程根目錄。

class_start <serviceclass>
   啟動指定類的所有服務(wù),如果它們是
   尚未運行。

class_stop <serviceclass>
   停止指定類的所有服務(wù),如果它們是
   目前正在運行。

domainname <name>
   設(shè)置域名。

insmod <path>
   將模塊安裝在 <path>

mkdir <path> [mode] [owner] [group]
   在 <path> 處創(chuàng)建一個目錄,可選擇使用給定的模式、所有者和
   團(tuán)體。如果未提供,則使用權(quán)限 755 和
   由 root 用戶和 root 組擁有。

mount <type> <device> <dir> [ <mountoption> ]*
   嘗試將命名設(shè)備掛載到目錄 <dir>
   <device> 可以是 mtd@name 的形式來指定一個 mtd 塊
   設(shè)備名稱。
   <mountoption>s 包括 "ro", "rw", "remount", "noatime", ...

restorecon <path>
   將 <path> 命名的文件恢復(fù)到指定的安全上下文
   在 file_contexts 配置中。
   init.rc 創(chuàng)建的目錄不需要,因為這些是
   由 init 自動正確標(biāo)記。

setcon <securitycontext>
   將當(dāng)前進(jìn)程安全上下文設(shè)置為指定的字符串。
   這通常僅在 early-init 中用于設(shè)置初始化上下文
   在任何其他進(jìn)程開始之前。

setenforce 0|1
   設(shè)置 SELinux 系統(tǒng)范圍的強制執(zhí)行狀態(tài)。
   0 是允許的(即記錄但不拒絕),1 是強制的。

setkey
   待定

setprop <name> <value>
   將系統(tǒng)屬性 <name> 設(shè)置為 <value>。

setrlimit <resource> <cur> <max>
   設(shè)置資源的 rlimit。

setsebool <name> <value>
   將 SELinux 布爾 <name> 設(shè)置為 <value>。
   <value> 可以是 1|true|on 或 0|false|off

start <service>
   如果服務(wù)尚未運行,則啟動該服務(wù)。

stop <service>
   如果服務(wù)當(dāng)前正在運行,則停止它的運行。

symlink <target> <path>
   在 <path> 處創(chuàng)建一個符號鏈接,其值為 <target>

sysclktz <mins_west_of_gmt>
   設(shè)置系統(tǒng)時鐘基準(zhǔn)(如果系統(tǒng)時鐘在 GMT 計時,則為 0)

trigger <event>
   觸發(fā)事件。用于將另一個動作排隊
   行動。

wait <path> [ <timeout> ]
  輪詢給定文件的存在并在找到時返回,
  或已達(dá)到超時。如果未指定超時,則
  當(dāng)前默認(rèn)為五秒。

write <path> <string> [ <string> ]*
   在 <path> 打開文件并寫入一個或多個字符串
   用 write(2)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容