Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android init源代碼分析(2)init.rc解析

Android init源代碼分析(2)init.rc解析

編輯:關於Android編程

本文描述init.rc腳本解析以及執行過程,讀完本章後,讀者應能
(1) 了解init.rc解析過程 (2) 定制init.rc

init.rc介紹 init.rc是一個文本文件,可認為它是Android系統啟動腳本。init.rc文件中定義了環境變量配置、系統進程啟動,分區掛載,屬性配置等諸多內容。init.rc具有特殊的語法。init源碼目錄下的readme.txt中詳細的描述了init啟動腳本的語法規則,是試圖定制init.rc的開發者的必讀資料。
Android啟動腳本包括一組文件,包括
init.rc
init.usb.rc
init.trace.rc
init.{hardware}.rc
init.environ.rc
init.zygote32.rc
這些文件可能分布於如下目錄中
system/core/rootdirdevice/{vendor}/{hardware}/ 除init.rc外,其他文件都由init.rc中以import語句導入,一般來說init.rc文件存放通用配置,而其他特定模塊以及特定硬件的配置則放置在獨立的文件中,這樣設計可以使init.rc腳本簡潔,方便系統維護和升級。

一個簡單的init.rc語法如下。(基於system/core/rootdir/init.rc裁剪)
# Copyright (C) 2012 The Android Open Source Project
#
# IMPORTANT: Do not create world writable files or directories.
# This is a common source of Android security bugs.
#

import /init.environ.rc
import /init.usb.rc
import /init.${ro.hardware}.rc
import /init.${ro.zygote}.rc
import /init.trace.rc
on early-init
    start ueventd

on init
    sysclktz 0
    loglevel 3
    mkdir /system
    mkdir /data 0771 system system
    write /proc/sys/kernel/panic_on_oops 1
# Load properties from /system/ + /factory after fs mount.
on load_all_props_action
    load_all_props
on post-fs
    # once everything is setup, no need to modify /
    mount rootfs rootfs / ro remount
on boot
    # basic network init
    ifup lo
    class_start core
    class_start main
on property:vold.decrypt=trigger_reset_main
    class_reset main
service ueventd /sbin/ueventd
    class core
    critical
on property:ro.debuggable=1
    start console
service debuggerd /system/bin/debuggerd
    class main
service bootanim /system/bin/bootanimation
    class main
    user graphics
    group graphics
    disabled
    oneshot

為了行文方便,下文提及init.rc,通常泛指Android啟動腳本。
init.rc可以定義兩類結構:Actions與Services。
Actions
Actions是一組命令的集合,定義一個Actions如下,每個Actions都可以定義一個觸發器(trigger),Actions格式如下:
on 
   
   
   
其中類似於shell命令,command對應一個函數,通常執行一條動作,例如創建一個文件夾等。

觸發器(Triggers)
觸發器只是一段字符串罷了 PS:在android/system/core/rootdir/下執行
grep -h "^on" --include="*.rc" -r .
可以當前init啟動腳本所含有的trigger,如下。
on early-init
on init
on property:sys.boot_from_charger_mode=1
on load_all_props_action
on firmware_mounts_complete
on late-init
on post-fs
on post-fs-data
on boot
on nonencrypted
on property:sys.init_log_level=*
on charger
on property:vold.decrypt=trigger_reset_main
on property:vold.decrypt=trigger_load_persist_props
on property:vold.decrypt=trigger_post_fs_data
on property:vold.decrypt=trigger_restart_min_framework
on property:vold.decrypt=trigger_restart_framework
on property:vold.decrypt=trigger_shutdown_framework
on property:sys.powerctl=*
on property:sys.sysctl.extra_free_kbytes=*
on property:sys.sysctl.tcp_def_init_rwnd=*
on property:ro.debuggable=1
on property:ro.kernel.qemu=1
on boot
on post-fs-data
on property:sys.usb.config=none
on property:sys.usb.config=adb
on property:sys.usb.config=accessory
on property:sys.usb.config=accessory,adb
on property:sys.usb.config=audio_source
on property:sys.usb.config=audio_source,adb
on property:sys.usb.config=accessory,audio_source
on property:sys.usb.config=accessory,audio_source,adb
on property:persist.sys.usb.config=*
根據trigger的不同,可以將Actions大致分為兩類: (1) 普通型
這類trigger的的作用僅僅是用於給一個Actions命名,方便查找和引用。如 early-init、init、late-init、early-fs、fs、post-fs、post-fs-data、early-boot、boot、charger等 一般來說,這類Actions將在Android啟動時執行,其trigger暗示了執行對應Actions執行的時機。具體的執行流程將在本文最後介紹。
此外,根據readme.txt描述,還有其他幾種trigger,但在init.rc以及init源代碼中卻沒有找到相關代碼,如下所示,
device-added- device-removed- 設備節點被添加或移除時調用,。
service-exited-
這類trigger將在某service退出時執行。關於什麼是service稍後介紹。

(2) 屬性型
其trigger為property:= 其trigger不僅唯一標識了這個Actions,同時也設定了這類Actons執行的條件,當property 的值為時才會被執行。
Commands

command的格式如下
command-name [parament2...]
<>表示必須存在的參數,[]表示可選參數
說明:readme.txt中雖然有大部分commands的介紹,但並不完整。init.rc中所有commands都在keywords.h中定義,可使用如下命令提取。
sed -n "s/KEYWORD(\([^,]\+\),[ \t]\+COMMAND.*/\1/p" keywords.h

目前Android4.4支持的Commands如下:
    chdir  改變工作目錄
    chroot  改變當前進程的root目錄
    class_start  如果serviceclass內所有services尚未啟動,則啟動它
    class_stop   停止serviceclass內所有services
    class_reset  重啟serviceclass內所有services
    domainname   設置domain名稱
    enable  
    exec  [  ]*  fork後執行path所執行的程序,該語句會阻塞直到path指定的程序執行完畢。
    export   設置全局環境變量,將會被該命令後所啟動的進程繼承。
    hostname  設置主機名
    ifup   啟動interface所指定的網絡接口
    insmod  安裝path所指定的內核模塊
    mkdir  [mode] [owner] [group] 創建path制定的目錄,並根據可選的mode、owner、group設定參數。如果未指定可選參數,則創建的文件夾權限將會設置為0755,而owner與group都為root
    mount_all
    mount     [ 
    restorecon
    restorecon_recursive
    rm  刪除path指定的文件
    rmdir  刪除path指定的目錄(目錄為空才能刪除)
    setcon
    setenforce
    setkey
    setprop
    setrlimit
    setsebool
    start 
    stop 
    swapon_all
    trigger
    symlink
    sysclktz
    wait
    write
    copy
    chown
    chmod
    loglevel
    load_persist_props
    load_all_props

Service 這裡的service僅僅是init.rc中的概念,與通常意義上的“服務”概念無關。一個Service對應一個可執行程序,並且可以設定該程序的一些執行性質,如僅僅執行一次、或退出時自動重啟。當service所代表的可執行程序在退出時自動重啟時,該service通常意味著這是一個守護進程。

service字段由如下格式定義
service   [  ]*
   
字段為service的名字,為該service對應的二進制程序的路徑,隨後是該程序的參數列表。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved