編輯:關於Android編程
Android init.rc文件詳解
本文主要來自$ANDROID_SOURCE/system/init/readme.txt的翻譯.
1 簡述
Android init.rc文件由系統第一個啟動的init程序解析,此文件由語句組成,主要包含了四種類型的語句:Action,Commands,Services,Options.在init.rc文件中一條語句通常是占據一行.單詞之間是通過空格符來相隔的.如果需要在單詞內使用空格,那麼得使用轉義字符"\",如果在一行的末尾有一個反斜槓,那麼是換行折疊符號,應該和下一行合並成一起來處理,這樣做主要是為了避免一行的字符太長,與C語言中的含義是一致的。注釋是以#號開頭。 Action和services顯式聲明了一個語句塊,而commands和options屬於最近聲明的語句塊。在第一個語句塊之前 的commands和options會被忽略.
在具體講解這之前,有些關鍵詞得先了解.
2 關鍵字
token: 計算機語言中的一個單詞,就跟英文中的單詞差不多一人概念.
Section: 語句塊,相當於C語言中大括號內的一個塊。一個Section以Service或On開頭的語句塊.以Service開頭的Section叫做服務,而以On開頭的叫做動作(Action).
services: 服務.
Action: 動作
commands:命令.
options:選項.
trigger:觸發器,或者叫做觸發條件.
class: 類屬,即可以為多個service指定一個相同的類屬,方便操作同時啟動或停止.
3 語句解析
3.1 動作(Action)
動作表示了一組命令(commands)組成.動作包含一個觸發器,決定了何時執行這個動作。當觸發器的條件滿足時,這個動作會被加入到已被執行的隊列尾。如果此動作在隊列中已經存在,那麼它將不會執行.
一個動作所包含的命令將被依次執行。動作的語法如下所示:
on <trigger> <command> <command> <command>
3.2 服務(services)
服務是指那些需要在系統初始化時就啟動或退出時自動重啟的程序.
它的語法結構如下所示:
service <name> <pathname> [ <argument> ]* <option> <option> ...
3.3 選項(options)
選項是用來修改服務的。它們影響如何及何時運行這個服務.
選項 描述 critical 據設備相關的關鍵服務,如果在4分鐘內,此服務重復啟動了4次,那麼設備將會重啟進入還原模式。 disabled 服務不會自動運行,必須顯式地通過服務器來啟動。 setenv <name> <value> 設置環境變量 socket <name> <type> <perm> [ <user> [ <group> ] ] 在/dev/socket/下創建一個unix domain的socket,並傳遞創建的文件描述符fd給服務進程.其中type必須為dgram或stream,seqpacket.用戶名和組名默認為0 user <username> 在執行此服務之前先切換用戶名。當前默認為root. group <groupname> [ <groupname> ]* 類似於user,切換組名 oneshot 當此服務退出時不會自動重啟. class <name> 給服務指定一個類屬,這樣方便操作多個服務同時啟動或停止.默認情況下為default. onrestart 當服務重啟時執行一條指令,
3.4 觸發器(trigger)
觸發器用來描述一個觸發條件,當這個觸發條件滿足時可以執行動作.
觸發器 描述 boot 當init程序執行,並載入/init.conf文件時觸發. <name>=<value> 當屬性名對應的值設置為指定值時觸發. device-added-<path> 當添加設備時觸發. device-removed-<path> 當設備移除時觸發. service-exited-<name> 當指定的服務退出時觸發.
3.5 命令(commands)
命令
描述
exec <path> [ <argument> ]*
執行指定路徑下的程序,並傳遞參數.
export <name> <value>
設置全局環境參數,此參數被設置後對所有進程都有效.
ifup <interface>
使指定的網絡接口"上線",相當激活指定的網絡接口
import <filename>
導入一個額外的init配置文件.
hostname <name>
設置主機名
chdir <directory>
改變工作目錄.
chmod <octal-mode> <path>
改變指定文件的讀取權限.
chown <owner> <group> <path>
改變指定文件的擁有都和組名的屬性.
chroot <directory>
改變進行的根目錄.
class_start <serviceclass>
啟動指定類屬的所有服務,如果服務已經啟動,則不再重復啟動.
class_stop <serviceclass>
停止指定類屬的所胡服務.
domainname <name>
設置域名
insmod <path>
安裝模塊到指定路徑.
mkdir <path> [mode] [owner] [group]
用指定參數創建一個目錄,在默認情況下,創建的目錄讀取權限為755.用戶名為root,組名為root.
mount <type> <device> <dir> [ <mountoption> ]*
類似於linux的mount指令
setkey
TBD(To Be Determined),待定.
setprop <name> <value>
設置屬性及對應的值.
setrlimit <resource> <cur> <max>
設置資源的rlimit(資源限制),不懂就百度一下rlimit
start <service>
如果指定的服務未啟動,則啟動它.
stop <service>
如果指定的服務當前正在運行,則停止它.
symlink <target> <path>
創建一個符號鏈接.
sysclktz <mins_west_of_gmt>
設置系統基准時間.
trigger <event>
Trigger an event. Used to queue an action from another action.這名話沒有理解,望高手指點.
write <path> <string> [ <string> ]*
往指定的文件寫字符串.
3.6 屬性(Properties)
屬性名 描述 init.action 當前正在執行的動作,如果沒有則為空字符串"" init.command 當前正在執行的命令.沒有則為空字符串. init.svc.<name> 當前某個服務的狀態,可為"stopped", "running", "restarting"
4 一個 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 /system mount yaffs2 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
5 調試注意事項
在默認情況下,通過init程序啟動的程序的標准輸出stdout和標准錯誤輸出stderr會重定向到/dev/null.如:
service akmd /system/bin/logwrapper /sbin/akmd
為了更方便調試你的程序,你可以使用Android的log系統,標准輸出和標准錯誤輸出會重定義到Android的log系統中來.
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
最近在做Android下的流量分析的一個功能,查閱了眾多資料,在手機不用Root的情況下,可以設置代理,對流量分析。也可以使用Android系統提供的VpnService
直接上代碼把,主要是重新給item measure高度,直接上代碼把 import java.util.ArrayList; import android.app.A
本文實例講述了Android編程實現讀取手機聯系人、撥號、發送短信及長按菜單操作方法。分享給大家供大家參考,具體如下:1.Andrid項目結構圖↓主要操作圖中紅色方框內的
【Activity】 一個Activity是一個應用程序組件,提供一個屏幕,用戶可以用來交互為了完成某項任務,例如撥號、拍照、發送email、看地圖。每一個activi