service vold /system/bin/vold \
--blkid_context=u:r:blkid:s0 --blkid_untrusted_context=u:r:blkid_untrusted:s0 \
--fsck_context=u:r:fsck:s0 --fsck_untrusted_context=u:r:fsck_untrusted:s0
class core
socket vold stream 0660 root mount
socket cryptd stream 0660 root mount
ioprio be 2
writepid /dev/cpuset/foreground/tasks
class core
service關鍵字聲明了你要定義一個service,而vold就是這個service的名字,至於后面的目錄則是這個service對應的可執行文件在系統中的位置。注意:這里是說在系統中的位置,也就是在開發板運行你的Android源碼編譯的系統后的目錄,而不是源碼的目錄。
定義為核心service,當core服務啟動時,這個vold啟動。
下面轉載http://www.cnblogs.com/hangxin1940/archive/2011/10/01/2196964.html
init.rc的語法分為行為(Actions),、命令(Commands) 、服務(Services)、選項(Options)。
類別 |
名稱 |
描述 |
SECTION | on | 觸發條件 |
同上.. | service | 解析service |
COMMAND | chdir | 更改當前工作目錄 |
同上.. | chroot | 更改參考的根目錄位置 |
.. | class_start | 啟動某個設置了class名稱的服務 |
.. | class_stop | 停止某個設置了class名稱的服務 |
.. | domainname | 域名 |
.. | exec | 調用程序並轉移進程 |
.. | export | 提交變量 |
.. | hostname | 主機名 |
.. | ifup | 激活網卡 |
.. | insmod | 掛載模塊 |
.. | import | 引入配置,比如etc下的一些rc文件,和java中的import差不多 |
.. | mkdir | 建立目錄 |
.. | mount | 掛載文件系統 |
.. | setkey | 從源碼看,應該是設置一個命令的關鍵字縮寫,比如可以將domainname映射為dn |
.. | setprop | 設置一個屬性 |
.. | setrlimit | 設置當前程序可以打開的最大文件數到系統規定程序可以打開的最大文件數 |
.. | start | 啟動服務 |
.. | stop | 停止服務 |
.. | trigger | 不清楚,難道是自定義觸發器? |
.. | symlink | 建立符號鏈接 |
.. | sysclktz | 設置基准時間 |
.. | wait | 等待文件准備好?Linux中這是進程調度的函數 |
.. | write | 向文件、設備寫個什么東西。肯定不是傳消息的那個wirte |
.. | copy | 不解釋 |
.. | chown | 更改所有者 |
.. | chmod | 更改權限 |
.. | loglevel | Log輸出級別,低於這個級別的就輸出 |
.. | restart | 重啟服務 |
OPTION | capability | 能力,也就是系統對進程的一種權限控制。 |
同上.. | class | 設置class name |
.. | console | 啟用控制台 |
.. | critical | 是否關鍵,也就是4分鍾之內重啟超過4次的話,重啟之后就進入recovery模式 |
.. | disabled | 不隨class自動啟動 |
.. | group | 組歸屬 |
.. | keycodes | 不明白。。。。。 |
.. | oneshot | 只啟動一次,意外退出后不必重啟 |
.. | onrestart | 重啟時 |
.. | setenv | 增加環境變量 |
.. | socket | 申請socket資源 |
.. | user | 用戶歸屬 |
.. | ioprio | io調度優先級 |
(很多屬性與命令用法都與linux中同名命令差球不多)
init是分段(section)解析init.rc的,在keywords.h中可以查看關鍵字的定義。init是以什么標志來分段解析init.rc呢?結合init.rc的內容,可以看出,分段標記是以on 和 service來標記的。下面詳細說明。
on 啥時候干什么
on屬於行為。
on early-init
init之前、加載完所有rc文件后即執行,在miui的rom中,init.rc在early-init執行的是start ueventd,根據keywords.h的定義,start是個命令(COMMAND)。
這里順便說下ueventd,android中底層(一般指驅動)通知上層的事件,用的是uevent,java層通過觀察者模式實現,用到的類為 UEventObserver,使用intent來傳遞;native層用的是android_os_UEventObserver.cpp,使用uevent.c通過socket傳遞。當然,這是framework及以下的層面,一般開發不經常用到,更何況這幾個類都沒有被暴露出來。
on init
加載propety各項屬性文件之前執行,在init變為propety service之前都屬於init階段。
on early-boot
啟動屬性服務后即執行。
on boot
boot的時候執行。
on property:xxxxx=x
當某個屬性設置為預期值時執行。
關於init.rc,其實結合/src/system/core/init/* 源碼和init.rc文件來看,會明白許多。
下面轉載自https://blog.csdn.net/kc58236582/article/details/52042331
init語言
init語言包括四個部分:(Actions)動作 commands(命令) Services(服務) Options(選項)
Actions和Services屬於一個新的section,而所有的Commands和options都必須屬於一個section。
Actions和Servics有一個獨立的名字。如果有重復的名字出現,那么會被認為是錯誤的。
Actions
Actions由幾行Commands組成,也有一個trigger用來決定Action的發生。當有事件發生且符合Action的trigger,會把Action加入執行隊列
Actions形式如下:
- on <trigger>
- <command>
- <command>
- <command>
on <trigger> <command> <command> <command>
Services
Services可以通過options 當它退出時重啟
- service <name> <pathname> [<argument>]*
- <option>
- <option>
service <name> <pathname> [<argument>]* <option> <option>
Options
Options用來初始化Service的
critical
當它在4分鍾內退出4次以上,設備重啟進入recovery模式
disabled
Service不會自動開啟當它的class啟動時,必須顯示的started by name(用其名字)
setenv <name> <value>
設置環境變量
socket <name> <type> <perm> [ <user> [ <group> [<seclabel> ] ] ]
創建一個socket named /dev/socket/<name>
user<username>
改變username當執行這個Service之前
group <groupname> [ <groupname> ]*
改變groupname當執行Service之前
seclabel <seclabel>
改變seclabel在執行Service之前
onshot
不要重啟Service當退出時
class <name>
為這個Service指定class。所有的Service可以用class name同時開啟和結束
onrestart
執行一個命令 當Service重啟時
writepid <file...>
當fork一個子進程時,寫子進程的pid到一個給定的文件。是給cgroup/cpuset使用
Triggers
Triggers被用來匹配事件,然后加入執行隊列。
boot
當init開啟時,這是第一個執行的trigger
<name>=<value>
這種形式的觸發器當屬性滿足條件時觸發
屬性可以多個,如:
- on property:test.a=1 && property:test.b=1
- setprop test.c 1
on property:test.a=1 && property:test.b=1 setprop test.c 1
Commands
bootchart_init
開啟bootcharting
chmod <octal-mode> <path>
改變文件執行權限
chown <owner> <group> <path>
改變文件的owner group
class_start <serviceclass>
開啟class start all services
class_stop <servicelass>
停止&disable all services
class_reset <serviceclass>
停止all services
copy <src> <dst>
copy一個文件 類似 write,但是對二進制大容量文件有用
domainname <name>
設置domain 名字
enable <servicename>
將一個disabled的service變成enabled。且start
exec [ <seclabel> [ <user> [ <group> ] * ] ] -- <command> [ <argument> ] *
Fork一個進程然后執行命令
export <name> <value>
設置環境變量into global
hostname <name>
設置host name
ifup <interface>
使網絡 interface online
import <filename>
引入init文件
insmod <path>
安裝一個module
load_all_props
加載system vendor的屬性
load_persist_props
加載data下面的persist屬性
loglevel
設置kernel的log level
mkdir <path> [mode] [owner] [group]
創建目錄
mount_all <fstab>
掛載fstab中的設備
mount <type> <device> <dir> [ <flag> ]* [<option>]
掛載設備
powerctl
對sys.powerctl屬性的respond
restart <service>
類似stop 但是不會disable service
restorecon <path> [ <path> ] *
恢復文件到sercurity context在file_contexts配置的
restorecon_recursive <path> [ <path> ]*
遞歸的恢復目錄中的文件到sercurity context
rm <path>
rm path
rmdir <path>
rmdir 目錄
setprop <name> <value>
設置系統屬性
setrlimit <resource> <cur> <max>
設置資源的rlimit
start <service>
開啟service
stop <service>
關閉service
swapon_all <fstab>
調用fs_mgr_swapon_all on the fstab文件
symlink <target> <path>
創建軟鏈接
sysclktz <mins_west_of_gmt>
設置系統clock base
trigger <event>
觸發觸發器
verity_load_state
加載dm-verity state
verity-update_state <mount_point>
update dm-versity state
wait <path> [ <timeout> ]
poll for 給定的文件 或者 timeout時間到。如果時間沒有設定,默認為5秒
write <path> <content>
打開文件,write string到給定文件。沒有文件會被創建。有的話,會truncated