android 初始化语言,25.Android init language (安卓初始化语言)
目前在研究framework框架,AIL是Android初始化語言,以下是根據(jù)官方文檔進(jìn)行的翻譯有助于研究Android啟動過程:
Android初始化語言包含了四種類型的聲明:Actions(行動)、Commands(命令)、Services(服務(wù))和Options(選項)。
所有這些都是以行為單位的,各種記號由空格來隔開。C語言風(fēng)格的反斜杠號可用于在記號間插入空格。雙引號也可用于防止字符串被空格分割成多個記號。行末的反斜杠用于折行。
注釋行以井號(#)開頭(允許以空格開頭)。
Actions和Services聲明一個新的分組。所有的命令或選項都屬于最近申明的分組。位于第一個分組之前的命令或選項將會被忽略。
Actions和Services有唯一的名字。如果有重名的情況,第二個申明的將會被作為錯誤忽略。(???我們是否應(yīng)該以覆蓋來代替忽略)
Actions(行動)
Actions其實就是一序列的Commands(命令)。Actions都有一個trigger(觸發(fā)器),它被用于決定action的執(zhí)行時間。當(dāng)一個符合action觸發(fā)條件的事件發(fā)生時,action會被加入到執(zhí)行隊列的末尾,除非它已經(jīng)在隊列里了。
隊列中的每一個action都被依次提取出,而這個action中的每個command(命令)都將被依次執(zhí)行。Init在這些命令的執(zhí)行期間還控制著其他的活動(設(shè)備節(jié)點的創(chuàng)建和注銷、屬性的設(shè)置、進(jìn)程的重啟)。
Actions的形式如下:
on
Services(服務(wù))
Services(服務(wù))是一個程序,他在初始化時啟動,并在退出時重啟(可選)。Services(服務(wù))的形式如下:
service [ ]*
Options(選項)
Options(選項)是一個Services(服務(wù))的修正者。他們影響Services(服務(wù))在何時,并以何種方式運(yùn)行。
critical(關(guān)鍵)
說明這是一個對于設(shè)備關(guān)鍵的服務(wù)。如果他四分鐘內(nèi)退出大于四次,系統(tǒng)將會重啟并進(jìn)入recovery(恢復(fù))模式。
disabled(失效)
說明這個服務(wù)不會同與他同trigger(觸發(fā)器)下的服務(wù)自動啟動。他必須被明確的按名啟動。
setenv (設(shè)置環(huán)境變量)
在進(jìn)程啟動時將環(huán)境變量設(shè)置為。
socket [ [ ] ]
創(chuàng)建一個Uinx域的名為/dev/socket/ 的套接字,并傳遞它的文件描述符給已啟動的進(jìn)程。 必須是 "dgram"或"stream"。User 和 group默認(rèn)為0。
user
在啟動這個服務(wù)前改變該服務(wù)的用戶名。此時默認(rèn)為root。(???有可能的話應(yīng)該默認(rèn)為nobody)。當(dāng)前,如果你的進(jìn)程要求Linux capabilities(能力),你無法使用這個命令。即使你是root,你也必須在程序中請求capabilities(能力)。然后降到你想要的uid。
group [ ]*
在啟動這個服務(wù)前改變該服務(wù)的組名。除了(必需的)第一個組名,附加的組名通常被用于設(shè)置進(jìn)程的補(bǔ)充組(通過setgroups())。此時默認(rèn)為root。(???有可能的話應(yīng)該默認(rèn)為nobody)。
oneshot
服務(wù)退出時不重啟。
class
指定一個服務(wù)類。所有同一類的服務(wù)可以同時啟動和停止。如果不通過class選項指定一個類,則默認(rèn)為"default"類服務(wù)。
onrestart
當(dāng)服務(wù)重啟,執(zhí)行一個命令(下詳)。
Triggers(觸發(fā)器)
Triggers(觸發(fā)器)是一個用于匹配特定事件類型的字符串,用于使Actions(行動)發(fā)生。
boot
這是init執(zhí)行后的第一個被觸發(fā)的Triggers(觸發(fā)器)。(在 /init.conf (啟動配置文件)被裝載之后)
=
這種形式的Triggers(觸發(fā)器)會在屬性被設(shè)置為指定的時被觸發(fā)。
device-added-
device-removed-
這種形式的Triggers(觸發(fā)器)會在一個設(shè)備節(jié)點文件被增刪時觸發(fā)。
service-exited-
這種形式的Triggers(觸發(fā)器)會在一個特定的服務(wù)退出時觸發(fā)。
Commands(命令)
exec [ ]*
創(chuàng)建和執(zhí)行一個程序()。在程序完全執(zhí)行前,init將會阻塞。由于它不是內(nèi)置命令,應(yīng)盡量避免使用exec,它可能會引起init卡死。(??? 是否需要一個超時設(shè)置?)
export
在全局環(huán)境變量中設(shè)在環(huán)境變量 為。(這將會被所有在這命令之后運(yùn)行的進(jìn)程所繼承)
ifup
啟動網(wǎng)絡(luò)接口
import
解析一個init配置文件,擴(kuò)展當(dāng)前配置。
hostname
設(shè)置主機(jī)名。
chmod
更改文件訪問權(quán)限。
chown
更改文件的所有者和組。
class_start
啟動所有指定服務(wù)類下的未運(yùn)行服務(wù)。
class_stop
停止指定服務(wù)類下的所有已運(yùn)行的服務(wù)。
domainname
設(shè)置域名。
insmod
加載中的模塊。
mkdir [mode] [owner] [group]
創(chuàng)建一個目錄,可以選擇性地指定mode、owner以及group。如果沒有指定,默認(rèn)的權(quán)限為755,并屬于root用戶和root組。
mount
[ ]*
試圖在目錄掛載指定的設(shè)備。 可以是以 mtd@name 的形式指定一個mtd塊設(shè)備。包括 "ro"、"rw"、"remount"、"noatime"、 ...
setkey
待完成......(暫時不可用)
setprop
設(shè)置系統(tǒng)屬性 為 值.
setrlimit
設(shè)置的rlimit(資源限制)。
start
啟動指定服務(wù)(如果此服務(wù)還未運(yùn)行)。
stop
停止指定服務(wù)(如果此服務(wù)在運(yùn)行中)。
symlink
創(chuàng)建一個指向的軟連接。
sysclktz
設(shè)置系統(tǒng)時鐘基準(zhǔn)(0代表時鐘滴答以格林威治平均時(GMT)為準(zhǔn))
trigger
觸發(fā)一個事件。用于將一個action與另一個 action排列。(?????)
write [ ]*
打開路徑為的一個文件,并寫入一個或多個字符串。
Properties(屬性)
Init更新一些系統(tǒng)屬性以提供對正在發(fā)生的事件的監(jiān)控能力:
init.action
此屬性值為正在被執(zhí)行的action的名字,如果沒有則為""。
init.command
此屬性值為正在被執(zhí)行的command的名字,如果沒有則為""。
init.svc.
名為的service的狀態(tài)("stopped"(停止), "running"(運(yùn)行), "restarting"(重啟))
init.conf實例
# not complete -- just providing some examples of usage
#
on boot
export PATH /sbin:/system/sbin:/system/bin
export LD_LIBRARY_PATH /system/lib
mkdir /dev
mkdir /proc
mkdir /sys
mount tmpfs tmpfs /dev
mkdir /dev/pts
mkdir /dev/socket
mount devpts devpts /dev/pts
mount proc proc /proc
mount sysfs sysfs /sys
write /proc/cpu/alignment 4
ifup lo
hostname localhost
domainname localhost
mount yaffs2 [mtd@system](http://blog.163.com/kissinger_1984/blog/static/168992520099121305590/mtd@system) /system
mount yaffs2 [mtd@userdata](http://blog.163.com/kissinger_1984/blog/static/168992520099121305590/mtd@userdata) /data
import /system/etc/init.conf
class_start default
service adbd /sbin/adbd
user adb
group adb
service usbd /system/bin/usbd -r
user usbd
group usbd
socket usbd 666
service zygote /system/bin/app_process -Xzygote /system/bin --zygote
socket zygote 666
service runtime /system/bin/runtime
user system
group system
on device-added-/dev/compass
start akmd
on device-removed-/dev/compass
stop akmd
service akmd /sbin/akmd
disabled
user akmd
group akmd
調(diào)試記錄
在默認(rèn)情況下,程序在被init執(zhí)行時會將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤都重定向到/dev/null(丟棄)。若你想要獲得調(diào)試信息,你可以通過Andoird系統(tǒng)中的logwrapper程序執(zhí)行你的程序。它會將標(biāo)準(zhǔn)輸出/標(biāo)準(zhǔn)錯誤都重定向到Android日志系統(tǒng)(通過logcat訪問)。
例如:
service akmd /system/bin/logwrapper /sbin/akmd
總結(jié)
以上是生活随笔為你收集整理的android 初始化语言,25.Android init language (安卓初始化语言)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】find()函数居然还能
- 下一篇: 【Python】创建数组[[0]*n]*