1. 程式人生 > >Android init.rc檔案淺析

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中需

Androidinit.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

androidinit.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.rcinit.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系統那樣一行行程式碼去做,顯得有點雜亂繁瑣,而且不容易擴充套件,所以

Androidinit.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