溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android init.rc文件淺析

發(fā)布時(shí)間:2020-08-05 10:03:04 來(lái)源:網(wǎng)絡(luò) 閱讀:532 作者:yangxiaoming123 欄目:移動(dòng)開(kāi)發(fā)

本文主要來(lái)自$ANDROID_SOURCE/system/init/readme.txt的翻譯.

1 簡(jiǎn)述

Android init.rc文件由系統(tǒng)第一個(gè)啟動(dòng)的init程序解析,此文件由語(yǔ)句組成,主要包含了四種類型的語(yǔ) 句:Action,Commands,Services,Options.在init.rc文件中一條語(yǔ)句通常是占據(jù)一行.單詞之間是通過(guò)空格符來(lái)相隔 的.如果需要在單詞內(nèi)使用空格,那么得使用轉(zhuǎn)義字符"\",如果在一行的末尾有一個(gè)反斜杠,那么是換行折疊符號(hào),應(yīng)該和下一行合并成一起來(lái)處理,這樣做主 要是為了避免一行的字符太長(zhǎng),與C語(yǔ)言中的含義是一致的。注釋是以#號(hào)開(kāi)頭。 Action和services顯式聲明了一個(gè)語(yǔ)句塊,而commands和options屬于最近聲明的語(yǔ)句塊。在第一個(gè)語(yǔ)句塊之前 的commands和options會(huì)被忽略.

在具體講解這之前,有些關(guān)鍵詞得先了解.

2 關(guān)鍵字

token:  計(jì)算機(jī)語(yǔ)言中的一個(gè)單詞,就跟英文中的單詞差不多一人概念.

Section: 語(yǔ)句塊,相當(dāng)于C語(yǔ)言中大括號(hào)內(nèi)的一個(gè)塊。一個(gè)Section以Service或On開(kāi)頭的語(yǔ)句塊.以Service開(kāi)頭的Section叫做服務(wù),而以O(shè)n開(kāi)頭的叫做動(dòng)作(Action).

services: 服務(wù).

Action: 動(dòng)作

commands:命令.

options:選項(xiàng).

trigger:觸發(fā)器,或者叫做觸發(fā)條件.

class: 類屬,即可以為多個(gè)service指定一個(gè)相同的類屬,方便操作同時(shí)啟動(dòng)或停止.

3 語(yǔ)句解析

3.1 動(dòng)作(Action)

動(dòng)作表示了一組命令(commands)組成.動(dòng)作包含一個(gè)觸發(fā)器,決定了何時(shí)執(zhí)行這個(gè)動(dòng)作。當(dāng)觸發(fā)器的條件滿足時(shí),這個(gè)動(dòng)作會(huì)被加入到已被執(zhí)行的隊(duì)列尾。如果此動(dòng)作在隊(duì)列中已經(jīng)存在,那么它將不會(huì)執(zhí)行.

 一個(gè)動(dòng)作所包含的命令將被依次執(zhí)行。動(dòng)作的語(yǔ)法如下所示:

[plain] view plaincopy

  1. on <trigger>  

  2.    <command>  

  3.    <command>  

  4.    <command>  


3.2 服務(wù)(services)

服務(wù)是指那些需要在系統(tǒng)初始化時(shí)就啟動(dòng)或退出時(shí)自動(dòng)重啟的程序.

它的語(yǔ)法結(jié)構(gòu)如下所示:

[plain] view plaincopy

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

  2.    <option>  

  3.    <option>  

  4.    ...  


3.3 選項(xiàng)(options)

選項(xiàng)是用來(lái)修改服務(wù)的。它們影響如何及何時(shí)運(yùn)行這個(gè)服務(wù).


選項(xiàng)描述
critical據(jù)設(shè)備相關(guān)的關(guān)鍵服務(wù),如果在4分鐘內(nèi),此服務(wù)重復(fù)啟動(dòng)了4次,那么設(shè)備將會(huì)重啟進(jìn)入還原模式。
disabled服務(wù)不會(huì)自動(dòng)運(yùn)行,必須顯式地通過(guò)服務(wù)器來(lái)啟動(dòng)。
setenv <name> <value>設(shè)置環(huán)境變量
socket <name> <type> <perm> [ <user> [ <group> ] ]在/dev/socket/下創(chuàng)建一個(gè)unix domain的socket,并傳遞創(chuàng)建的文件描述符fd給服務(wù)進(jìn)程.其中type必須為dgram或stream,seqpacket.用戶名和組名默認(rèn)為0
user <username>在執(zhí)行此服務(wù)之前先切換用戶名。當(dāng)前默認(rèn)為root.
group <groupname> [ <groupname> ]*類似于user,切換組名
oneshot當(dāng)此服務(wù)退出時(shí)不會(huì)自動(dòng)重啟.
class <name>給服務(wù)指定一個(gè)類屬,這樣方便操作多個(gè)服務(wù)同時(shí)啟動(dòng)或停止.默認(rèn)情況下為default.
onrestart當(dāng)服務(wù)重啟時(shí)執(zhí)行一條指令,


3.4 觸發(fā)器(trigger)

觸發(fā)器用來(lái)描述一個(gè)觸發(fā)條件,當(dāng)這個(gè)觸發(fā)條件滿足時(shí)可以執(zhí)行動(dòng)作.


觸發(fā)器描述
boot當(dāng)init程序執(zhí)行,并載入/init.conf文件時(shí)觸發(fā).
<name>=<value>當(dāng)屬性名對(duì)應(yīng)的值設(shè)置為指定值時(shí)觸發(fā).
device-added-<path>當(dāng)添加設(shè)備時(shí)觸發(fā).
device-removed-<path>當(dāng)設(shè)備移除時(shí)觸發(fā).
service-exited-<name>當(dāng)指定的服務(wù)退出時(shí)觸發(fā).

3.5 命令(commands)


命令描述
exec <path> [ <argument> ]*
執(zhí)行指定路徑下的程序,并傳遞參數(shù).
export <name> <value>設(shè)置全局環(huán)境參數(shù),此參數(shù)被設(shè)置后對(duì)所有進(jìn)程都有效.
ifup <interface>使指定的網(wǎng)絡(luò)接口"上線",相當(dāng)激活指定的網(wǎng)絡(luò)接口
import <filename>導(dǎo)入一個(gè)額外的init配置文件.
hostname <name>設(shè)置主機(jī)名
chdir <directory>改變工作目錄.
chmod <octal-mode> <path>改變指定文件的讀取權(quán)限.
chown <owner> <group> <path>改變指定文件的擁有都和組名的屬性.
chroot <directory>改變進(jìn)行的根目錄.
class_start <serviceclass>啟動(dòng)指定類屬的所有服務(wù),如果服務(wù)已經(jīng)啟動(dòng),則不再重復(fù)啟動(dòng).
class_stop <serviceclass>停止指定類屬的所胡服務(wù).
domainname <name>設(shè)置域名
insmod <path>安裝模塊到指定路徑.
mkdir <path> [mode] [owner] [group]用指定參數(shù)創(chuàng)建一個(gè)目錄,在默認(rèn)情況下,創(chuàng)建的目錄讀取權(quán)限為755.用戶名為root,組名為root.
mount <type> <device> <dir> [ <mountoption> ]*類似于linux的mount指令
setkeyTBD(To Be Determined),待定.
setprop <name> <value>設(shè)置屬性及對(duì)應(yīng)的值.
setrlimit <resource> <cur> <max>設(shè)置資源的rlimit(資源限制),不懂就百度一下rlimit
start <service>如果指定的服務(wù)未啟動(dòng),則啟動(dòng)它.
stop <service>如果指定的服務(wù)當(dāng)前正在運(yùn)行,則停止它.
symlink <target> <path>創(chuàng)建一個(gè)符號(hào)鏈接.
sysclktz <mins_west_of_gmt>設(shè)置系統(tǒng)基準(zhǔn)時(shí)間.
trigger <event>Trigger an event.  Used to queue an action from another action.這名話沒(méi)有理解,望高手指點(diǎn).
write <path> <string> [ <string> ]*往指定的文件寫(xiě)字符串.


3.6 屬性(Properties)

init程序在運(yùn)行時(shí)會(huì)更新屬性系統(tǒng)的一些屬性,提供程序內(nèi)部正在執(zhí)行的信息.


屬性名描述
init.action當(dāng)前正在執(zhí)行的動(dòng)作,如果沒(méi)有則為空字符串""
init.command當(dāng)前正在執(zhí)行的命令.沒(méi)有則為空字符串.
init.svc.<name>當(dāng)前某個(gè)服務(wù)的狀態(tài),可為"stopped", "running", "restarting"


4 一個(gè) init.conf例子

[plain] view plaincopy

  1. # not complete -- just providing some examples of usage  

  2. #  

  3. on boot  

  4.    export PATH /sbin:/system/sbin:/system/bin  

  5.    export LD_LIBRARY_PATH /system/lib  

  6.   

  7.    mkdir /dev  

  8.    mkdir /proc  

  9.    mkdir /sys  

  10.   

  11.    mount tmpfs tmpfs /dev  

  12.    mkdir /dev/pts  

  13.    mkdir /dev/socket  

  14.    mount devpts devpts /dev/pts  

  15.    mount proc proc /proc  

  16.    mount sysfs sysfs /sys  

  17.   

  18.    write /proc/cpu/alignment 4  

  19.   

  20.    ifup lo  

  21.   

  22.    hostname localhost  

  23.    domainname localhost  

  24.   

  25.    mount yaffs2 mtd@system /system  

  26.    mount yaffs2 mtd@userdata /data  

  27.   

  28.    import /system/etc/init.conf  

  29.   

  30.    class_start default  

  31.   

  32. service adbd /sbin/adbd  

  33.    user adb  

  34.    group adb  

  35.   

  36. service usbd /system/bin/usbd -r  

  37.    user usbd  

  38.    group usbd  

  39.    socket usbd 666  

  40.   

  41. service zygote /system/bin/app_process -Xzygote /system/bin --zygote  

  42.    socket zygote 666  

  43.   

  44. service runtime /system/bin/runtime  

  45.    user system  

  46.    group system  

  47.   

  48. on device-added-/dev/compass  

  49.    start akmd  

  50.   

  51. on device-removed-/dev/compass  

  52.    stop akmd  

  53.   

  54. service akmd /sbin/akmd  

  55.    disabled  

  56.    user akmd  

  57.    group akmd  

  58.    


5 調(diào)試注意事項(xiàng)

在默認(rèn)情況下,通過(guò)init程序啟動(dòng)的程序的標(biāo)準(zhǔn)輸出stdout和標(biāo)準(zhǔn)錯(cuò)誤輸出stderr會(huì)重定向到/dev/null.如:

[plain] view plaincopy

  1. service akmd /system/bin/logwrapper /sbin/akmd  

為了更方便調(diào)試你的程序,你可以使用Android的log系統(tǒng),標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出會(huì)重定義到Android的log系統(tǒng)中來(lái).


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI