android啓動過程配置文件的解析與語法

(1)android啓動文件系統後調用的第一個應用程序是/init,此文件的很重要的內容是解析了init.rc和init.xxx.rc
兩個配置文件,然後執行解析出來的任務。相關代碼在android源代碼/system/core/init/init.c文件中,如下:
    parse_config_file("/init.rc");

    /* pull the kernel commandline and ramdisk properties file in */
    qemu_init();
    import_kernel_cmdline(0);

    get_hardware_name();
    snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware);
    parse_config_file(tmp);

(2)從上面代碼可以看到,第一個配置文件名稱固定爲init.rc,而第二個配置文件格式爲init.xxx.rc,其中xxx部分的內容
是從內核讀取的,具體是讀取文件/proc/cpuinfo中的Hardware部分,然後截取其部分內容。Hardware部分是定義在內核的
主板定義文件中,我的平臺是定義在內核arch/arm/mach-mmp/merlin.c中,我的平臺定義如下:
MACHINE_START(ARDENT_MERLIN, "PXA168-based Merlin Platform")
    .phys_io = APB_PHYS_BASE,
    .boot_params = 0x00000100,
    .io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc,
    .map_io = pxa_map_io,
    .init_irq = pxa168_init_irq,
    .timer = &pxa168_timer,
    .init_machine = merlin_init,
MACHINE_END
這樣截取到的hardware部分的內容就爲pxa168-based,也就是說我的平臺的第二個配置文件應該命名爲init.pxa168-based.rc

(3)從上面看init.xxx.rc中的xxx內容是取決是內核中主板的定義的,如果覺得麻煩,可以將其在代碼中寫死,例如:
    parse_config_file(“init.merlin.rc”);

(4)配置文件的語法如下:
(a)配置文件的內容包含有4種:
     動作(Action)
     命令(Commands)
     服務(Services)
     選項(Options)
(b)動作和命令一起使用,形式如下:
on <trigger>
  <command>
  <command>
  <command>
其中trigger是觸發條件,也就是說在滿足觸發條件的情況下執行1個或多個相應的命令,舉例如下:
on property:persist.service.adb.enable=1
    start adbd

(c)服務和選項一起使用,形式如下:
  service <name> <pathname> [ <argument> ]*
  <option>
  <option>
  ...
上面內容解釋爲:
  service 服務名稱 服務對應的命令的路徑 命令的參數
    選項
    選項
  ...
舉例如下:
service ril-daemon /system/bin/rild
    socket rild stream 660 root radio
    socket rild-debug stream 660 radio system
    user root
    group radio cache inet misc audio
上面的服務對應到/system/bin/rild命令,沒有參數,服務名稱爲ril-daemon,後面的內容都是服務的選項。

(d)選項是影響服務啓動和運行的參數,主要的選項如下:

disabled  禁用服務,此服務開機時不會自動啓動,但是可以在應用程序中手動啓動它。

socket <type> <name> <perm> [ <user> [ <group> ] ]
套接字    類型        名稱           權限           用戶           組
創建一個名爲/dev/socket/<name>,然後把它的fd傳給啓動程序
類型type的值爲dgram或者stream
perm表示該套接字的訪問權限,user和group表示改套接字所屬的用戶和組,這兩個參數默認都是0,因此可以不設置。

user <username>
執行服務前切換到用戶<username>,此選項默認是root,因此可以不設置。

group <groupname> [ <groupname> ]*
執行服務前切換到組<groupname>,此選項默認是root,因此可以不設置

capability [ <capability> ]+
執行服務前設置linux capability,沒什麼用。

oneshot
服務只啓動一次,一旦關閉就不能再啓動。

class <name>
爲服務指定一個類別,默認爲"default",同一類別的服務必須一起啓動和停止

(e)動作觸發條件<trigger>
boot  首個觸發條件,初始化開始(載入配置文件)的時候觸發

<name>=<value>
當名爲<name>的屬性(property)的值爲<value>的時候觸發

device-added-<path>
路徑爲<path>的設置添加的時候觸發

device-removed-<path>
路徑爲<path>的設置移除的時候觸發

service-exited-<name>
名爲<name>的服務關閉的時候觸發

(f)命令(Command)的形式
exec <path> [ <argument> ]*
複製(fork)和執行路徑爲<path>的應用程序,<argument>爲該應用程序的參數,在該應用程序執行完前,此命令會屏蔽,

export <name> <value>
聲明名爲<name>的環境變量的值爲<value>,聲明的環境變量是系統環境變量,啓動後一直有效。

ifup <interface>
啓動名爲<interface>的網絡接口

import <filename>
加入新的位置文件,擴展當前的配置。

hostname <name>
設置主機名

class_start <serviceclass>
啓動指定類別的所有服務

class_stop <serviceclass>
停止指定類別的所有服務

domainname <name>
設置域名

insmod <path>
加載路徑爲<path>的內核模塊

mkdir <path>
創建路徑爲<path>目錄

mount <type> <device> <dir> [ <mountoption> ]*
掛載類型爲<type>的設備<device>到目錄<dir>,<mountoption>爲掛載參數,距離如下:
    mount ubifs ubi1_0 /data nosuid nodev

setkey
暫時未定義

setprop <name> <value>
設置名爲<name>的系統屬性的值爲<value>

setrlimit <resource> <cur> <max>
設置資源限制,舉例:
# set RLIMIT_NICE to allow priorities from 19 to -20
    setrlimit 13 40 40
沒看懂是什麼意思。

start <service>
啓動服務(如果服務未運行)

stop <service>
停止服務(如果服務正在運行)

symlink <target> <path>
創建一個從<path>指向<target>的符號鏈接,舉例:
    symlink /system/etc /etc

write <path> <string> [ <string> ]*
打開路徑爲<path>的文件並將一個多這多個字符串寫入到該文件中。

(g)系統屬性(Property)
android初始化過程中會修改一些屬性,通過getprop命令我們可以看到屬性值,這些屬性指示了某些動作或者服務的狀態,主要如下:
init.action      如果當前某個動作正在執行則init.action屬性的值等於該動作的名稱,否則爲""
init.command     如果當前某個命令正在執行則init.command屬性的值等於該命令的名稱,否則爲""
init.svc.<name>  此屬性指示個名爲<name>的服務的狀態("stopped", "running", 或者 "restarting").

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/jiajie961/archive/2010/11/11/6002871.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章