android rc文件分析


service vold /system/bin/vold \
        --blkid_context=u:r:blkid:s0 --blkid_untrusted_context=u:r:blkid_untrusted:s0 \
        --fsck_context=u:r:fsck:s0 --fsck_untrusted_context=u:r:fsck_untrusted:s0
    class core
    socket vold stream 0660 root mount
    socket cryptd stream 0660 root mount
    ioprio be 2
    writepid /dev/cpuset/foreground/tasks

class core

service關鍵字聲明了你要定義一個service,而vold就是這個service的名字,至於后面的目錄則是這個service對應的可執行文件在系統中的位置。注意:這里是說在系統中的位置,也就是在開發板運行你的Android源碼編譯的系統后的目錄,而不是源碼的目錄。

定義為核心service,當core服務啟動時,這個vold啟動。

下面轉載http://www.cnblogs.com/hangxin1940/archive/2011/10/01/2196964.html

   init.rc的語法分為行為(Actions),、命令(Commands) 、服務(Services)、選項(Options)

類別

名稱

描述

SECTION on 觸發條件
同上.. service 解析service
COMMAND chdir 更改當前工作目錄
同上.. chroot 更改參考的根目錄位置
.. class_start 啟動某個設置了class名稱的服務
.. class_stop 停止某個設置了class名稱的服務
.. domainname 域名
.. exec 調用程序並轉移進程
.. export 提交變量
.. hostname 主機名
.. ifup 激活網卡
.. insmod 掛載模塊
.. import 引入配置,比如etc下的一些rc文件,和java中的import差不多
.. mkdir 建立目錄
.. mount 掛載文件系統
.. setkey 從源碼看,應該是設置一個命令的關鍵字縮寫,比如可以將domainname映射為dn
.. setprop 設置一個屬性
.. setrlimit

設置當前程序可以打開的最大文件數到系統規定程序可以打開的最大文件數

.. start 啟動服務
.. stop 停止服務
.. trigger 不清楚,難道是自定義觸發器?
.. symlink 建立符號鏈接
.. sysclktz

設置基准時間

.. wait 等待文件准備好?Linux中這是進程調度的函數
.. write 向文件、設備寫個什么東西。肯定不是傳消息的那個wirte
.. copy 不解釋
.. chown 更改所有者
.. chmod 更改權限
.. loglevel Log輸出級別,低於這個級別的就輸出
.. restart 重啟服務
OPTION capability 能力,也就是系統對進程的一種權限控制。
同上.. class 設置class name
.. console 啟用控制台
.. critical 是否關鍵,也就是4分鍾之內重啟超過4次的話,重啟之后就進入recovery模式
.. disabled 不隨class自動啟動
.. group 組歸屬
.. keycodes 不明白。。。。。
.. oneshot 只啟動一次,意外退出后不必重啟
.. onrestart 重啟時
.. setenv 增加環境變量
.. socket 申請socket資源
.. user 用戶歸屬
.. ioprio io調度優先級

(很多屬性與命令用法都與linux中同名命令差球不多)

       init是分段(section)解析init.rc的,在keywords.h中可以查看關鍵字的定義。init是以什么標志來分段解析init.rc呢?結合init.rc的內容,可以看出,分段標記是以on 和 service來標記的。下面詳細說明。

    on   啥時候干什么

        on屬於行為。

      on early-init   

             init之前、加載完所有rc文件后即執行,在miui的rom中,init.rc在early-init執行的是start ueventd,根據keywords.h的定義,start是個命令(COMMAND)。

             這里順便說下ueventd,android中底層(一般指驅動)通知上層的事件,用的是uevent,java層通過觀察者模式實現,用到的類為 UEventObserver,使用intent來傳遞;native層用的是android_os_UEventObserver.cpp,使用uevent.c通過socket傳遞。當然,這是framework及以下的層面,一般開發不經常用到,更何況這幾個類都沒有被暴露出來。

      on init

             加載propety各項屬性文件之前執行,在init變為propety service之前都屬於init階段。            

      on early-boot

             啟動屬性服務后即執行。

      on boot

             boot的時候執行。

      on property:xxxxx=x

             當某個屬性設置為預期值時執行。 

 

     關於init.rc,其實結合/src/system/core/init/* 源碼和init.rc文件來看,會明白許多。

 

下面轉載自https://blog.csdn.net/kc58236582/article/details/52042331

init語言

init語言包括四個部分:(Actions)動作 commands(命令) Services(服務) Options(選項)

Actions和Services屬於一個新的section,而所有的Commands和options都必須屬於一個section。

Actions和Servics有一個獨立的名字。如果有重復的名字出現,那么會被認為是錯誤的。

 

Actions

Actions由幾行Commands組成,也有一個trigger用來決定Action的發生。當有事件發生且符合Action的trigger,會把Action加入執行隊列

Actions形式如下:

 

[plain] view plain copy
 
print?
  1. on <trigger>  
  2.      <command>  
  3.      <command>  
  4.      <command>  
on <trigger>
     <command>
     <command>
     <command>

 

 

Services

Services可以通過options 當它退出時重啟

[plain] view plain copy
 
print?
  1. service <name> <pathname> [<argument>]*  
  2.     <option>  
  3.     <option>  
service <name> <pathname> [<argument>]*
    <option>
    <option>

 

Options

Options用來初始化Service的

 

critical

當它在4分鍾內退出4次以上,設備重啟進入recovery模式

 

disabled

Service不會自動開啟當它的class啟動時,必須顯示的started by name(用其名字)

 

setenv <name> <value>

設置環境變量

 

socket <name> <type> <perm> [ <user> [ <group> [<seclabel> ] ] ]

創建一個socket named /dev/socket/<name>

 

user<username>

改變username當執行這個Service之前

 

group <groupname> [ <groupname> ]*

改變groupname當執行Service之前

 

seclabel <seclabel>

改變seclabel在執行Service之前

 

onshot

不要重啟Service當退出時

 

class <name>

為這個Service指定class。所有的Service可以用class name同時開啟和結束

 

onrestart

執行一個命令 當Service重啟時

 

writepid <file...>

當fork一個子進程時,寫子進程的pid到一個給定的文件。是給cgroup/cpuset使用

 

Triggers

Triggers被用來匹配事件,然后加入執行隊列。

 

boot

當init開啟時,這是第一個執行的trigger

 

<name>=<value>

這種形式的觸發器當屬性滿足條件時觸發

屬性可以多個,如:

 

[plain] view plain copy
 
print?
  1. on property:test.a=1 && property:test.b=1  
  2.     setprop test.c 1  
on property:test.a=1 && property:test.b=1
    setprop test.c 1



 

Commands

bootchart_init

開啟bootcharting

 

chmod <octal-mode> <path>

改變文件執行權限

 

chown <owner> <group> <path>

改變文件的owner group

 

class_start <serviceclass>

開啟class start all services

 

class_stop <servicelass>

停止&disable all services

 

class_reset <serviceclass>

停止all services

 

copy  <src> <dst>

copy一個文件  類似 write,但是對二進制大容量文件有用

 

domainname <name>

設置domain 名字

 

enable <servicename>

將一個disabled的service變成enabled。且start

 

exec [ <seclabel> [ <user> [ <group> ] * ] ]  -- <command> [ <argument> ] *

Fork一個進程然后執行命令

 

export <name> <value>

設置環境變量into global

 

hostname <name>

設置host name

 

ifup  <interface>

使網絡 interface online

 

import <filename>

引入init文件

 

insmod <path>

安裝一個module

 

load_all_props

加載system vendor的屬性

 

load_persist_props

加載data下面的persist屬性

 

loglevel

設置kernel的log level

 

mkdir <path> [mode] [owner] [group]

創建目錄

 

mount_all <fstab>

掛載fstab中的設備

 

mount <type> <device> <dir> [ <flag> ]* [<option>]

掛載設備

 

powerctl

對sys.powerctl屬性的respond

 

restart <service>

類似stop 但是不會disable service

 

restorecon <path> [ <path> ] *

恢復文件到sercurity context在file_contexts配置的

 

restorecon_recursive <path> [ <path> ]*

遞歸的恢復目錄中的文件到sercurity context

 

rm  <path>

rm path

 

rmdir  <path>

rmdir  目錄

 

setprop <name> <value>

設置系統屬性

 

setrlimit <resource> <cur> <max>

設置資源的rlimit

 

start <service>

開啟service

 

stop  <service>

關閉service

 

swapon_all <fstab>

調用fs_mgr_swapon_all on the fstab文件

 

symlink <target> <path>

創建軟鏈接

 

sysclktz  <mins_west_of_gmt>

設置系統clock base

 

trigger <event>

觸發觸發器

 

verity_load_state

加載dm-verity state

 

verity-update_state  <mount_point>

update dm-versity state

 

wait <path> [ <timeout> ]

poll for 給定的文件 或者 timeout時間到。如果時間沒有設定,默認為5秒

 

write <path> <content>

打開文件,write string到給定文件。沒有文件會被創建。有的話,會truncated


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM