天天看點

Android 啟動分析-init程序&init.rc[轉]

init.rc解析與chmod 改變檔案屬性沒用  

轉自:http://h1372865100.blog.163.com/blog/static/2104291032012929114132327/

android的init.rc文法是獨有的,可以說是一種語言吧。

       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

             啟動屬性service後即執行。

      on boot

             boot的時候執行。

      on property:xxxxx=x

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

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

=========

有時需要添加你自己增加的檔案到root的時候,然後在init.rc修改檔案的屬性發現沒有用,我也是折騰了半天,在網上看到有一個文章:

create a script somewhere, for example, /system/bin/mymod.rc

#!/system/bin/sh

   chmod 0777 /dev/mynode 

 add the following in /init.rc:

  service mymod /system/bin/mymod.rc

    oneshot

(注意表添加錯了位置/system/bin/,是生成檔案系統的system目錄,不是root下的system目錄)