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程式在執行時會更新屬性系統的一些屬性,提供程式內部正在執行的資訊.
屬性名 | 描述 |
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 [email protected] /system
mount yaffs2 [email protected] /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 init.rc檔案淺析
本文主要來自$ANDROID_SOURCE/system/init/readme.txt的翻譯. 1 簡述 Android init.rc檔案由系統第一個啟動的init程式解析,此檔案由語句組成,主要包含了四種類型的語句:Action,Commands,Services,O
android init.rc檔案語法詳解
初始化語言包含了四種類型的宣告: Actions(行動)、 Commands(命令)、Services(服務)和Options(選項)。 基本語法規定 1 所有型別的語句都是基於行的,一個語句包含若干個tokens,token之間通過空格字元分隔. 如果一個token中需
Android 的 init.rc 檔案簡介
init.rc由許多的Action和Service組成。每一個語句佔據一行,並且各個關鍵字被空格分開. 由 # (前面允許有空格)開始的行都是註釋行(comment) 一個actions 或 services 的開始隱含聲明瞭一個新的段,所有commands 或 option
Android init.rc 筆記(概況及init.rc文法)
Android的根目錄下有一系列非常重要的配置檔案,即:init.rc init.xxxxx.rc Android中解析這些配置檔案的程式碼在:system\core\init目錄下。 核心檔案是init.c,相關的文法說明請參見:readme.txt 本文簡單介紹一下i
Android init.rc語法介紹
一、簡述 Android init.rc檔案由系統第一個啟動的init程式解析,此檔案由語句組成,主要包含了四種類型的語句:Action, Commands,Services, Options. 在init.rc 檔案中一條語句通常是佔據一行.單詞之間是通過空格符來相
如何去寫 Android init.rc (Android init language)
Android 初始化語言由四大類宣告組成 : 行為類 (Actions), 命令類 (Commands) ,服務類 (Services), 選項類 (Options). 初始化語言以行為單位,由以空格間隔的語言符號組成。 C 風格的反斜槓轉義符可以用
【Android7.1.2原始碼解析系列】實戰分析init.rc檔案
實戰分析init.rc檔案 前言:經過上一篇的/system/core/init/readme.txt檔案的翻譯,對於init.rc的語法也有了一定的瞭解,這一篇就對/system/core/rootdir/init.rc檔案進行一個分析,希望能夠藉此對android的開
Android init.rc on property
在 init.rc 中,可以見到下面類似的用法,當一個屬性值等於XX時,觸發下面的事件,比如啟動一個程序,或者設定列印級別 on property:sys.init_log_level=*
Android7.0解析Init.rc檔案
在解析Init.rc之前需要對init.rc檔案有一個認識,init.rc是由一種被稱為"Android初始化語言"(Android Init Language,這裡簡稱為AIL)的指令碼寫成的檔案.該語言是由語句組成的,主要包含了五種型別的語句:ActionComm
Android init.rc中各條命令開機過程中執行順序
1. 所有的action運行於service之前2. 下面為各個section的執行順序,英文編號的section是系統內建的(寫死在init.c中的命令)1) early-init a) wait_for_coldboot_done b) property_i
Android init.rc啟動服務
轉載 http://m.it610.com/article/5082334.htm 在“上一篇android init.rc檔案語法詳解”,但是到了android5.0之後,按照上面的方法做,可能我們要啟動的服務就起不來了。這是因為採用了新的安全機制了——SEAndr
android—init.rc中on property的觸發
在前面的文章《android—init.rc的讀取 》中主要介紹了init.rc檔案的讀取,本文主要分析init針對on property型別的屬性觸發的原理。 init中的處理過程 在init.c的main()中, int main(int
Android 7.0 init.rc 執行shell指令碼 ---- 製作一初始化配置檔案
最近在一個Android 7.0 PDA專案中遇到如下需求:初始化一配置檔案,此配置檔案需要儲存到data分割槽供系統服務和第三方應用進行讀寫操作,另外此配置檔案在系統重啟後保持檔案內容不變,除非恢復出廠才可以恢復成預設配置引數 。因為初始化的配置引數為了方便其它同事修改
Android修改init.rc和init.xx.rc檔案
一、檔案簡介 init.rc:Android在啟動過程中讀取的啟動指令碼檔案,主要完成一些初級的初始化,在/system/core/init/init.c中解析。 init.xx.rc:與具體CPU相關的啟動指令碼,比如對於飛思卡爾的CPU,名字為init.freescal
Android如何配置init.rc中的開機啟動程序(service)
轉載。 http://blog.csdn.net/qq_28899635/article/details/56289063 開篇:為什麼寫這篇文章 先說下我自己的情況,我是個普通的學生,之前在學校一直做Android應用開發,找實習的時候也一直想找相關的工作,來到現在這家公司以
Android 8.0 系統啟動流程之init.rc解析與service流程(七)
1、概述 上一篇文章中我們介紹了一下init.rc檔案中的語法規則,而本文將分析如何解析rc檔案,並對rc檔案中的某一service啟動過程進行分析。 2、解析.rc檔案 之前我們在文件中看到.rc檔案主要有根目錄下的 /init.rc ,以及
Android 8.0 系統啟動流程之init.rc語法規則(六)
1、概述 init經過前兩個階段後,已經建立了屬性系統和SELinux系統,但是init程序還需要執行很多其他的操作,還要啟動許多關鍵的系統服務,但是如果都是像屬性系統和SELinux系統那樣一行行程式碼去做,顯得有點雜亂繁瑣,而且不容易擴充套件,所以
Android在init.rc中加入指令碼開機安裝APK並啟動APK的服務
要求:開機檢查APK是否安裝,如果不安裝則自動靜默安裝,同時啟動APK的服務。 把要安裝的APK放在device資料夾下,編譯時用指令碼拷貝到out目錄下,開機啟動指令碼安裝APK並啟動服務。 這裡以Airplay.apk為例。 1.在device目錄下建立資料夾Ai
Android init原始碼分析(2)init.rc解析
action_for_each_trigger("early-init", action_add_queue_tail); queue_builtin_action(wait_for_coldboot_done_action, "wait_for_coldboot_done"); q
init rc中建立檔案
android的init rc目前不支援touch: touch /data/misc/logd/kmsg.log log中會報錯: init: /init.rc: 83: invalid keyword 'touch' 可以用copy和write命令建立檔案 writ