1. 程式人生 > >Android init.rc語法介紹

Android init.rc語法介紹

一、簡述
    Android init.rc檔案由系統第一個啟動的init程式解析,此檔案由語句組成,主要包含了四種類型的語句:Action, Commands,Services, Options. 在init.rc 檔案中一條語句通常是佔據一行.單詞之間是通過空格符來相隔的,如果需要在單詞內使用空格,那麼得使用轉義字元"\", 如果在一行的末尾有一個反斜槓,那麼是換行摺疊符號,應該和下一行合併成一起來處理,這樣做主要是為了避免一行的字元太長,與C語言中的含義是一致的。註釋是以#號開頭。 Action和 services顯式聲明瞭一個語句塊,而commands和options屬於最近宣告的語句塊。在第一個語句塊之前 的commands和options會被忽略.


首先瞭解這些關鍵詞

二、關鍵字

  token:  計算機語言中的一個單詞,就跟英文中的單詞差不多一人概念.
  Section: 語句塊,相當於C語言中大括號內的一個塊。一個Section以Service或On開頭的語句塊.以Service開頭的Section叫做服務,而以On開頭的叫做動作(Action).
  services: 服務.
  Action: 動作
  commands:命令.
  options:選項.
  trigger:觸發器,或者叫做觸發條件.

  class: 類屬,即可以為多個service指定一個相同的類屬,方便操作同時啟動或停止.

三、語句解析

  1 動作(Action)

  動作表示了一組命令(commands)組成.動作包含一個觸發器,決定了何時執行這個動作。當觸發器的條件滿足時,這個動作會被加入到已被執行的佇列尾。如果此動作在佇列中已經存在,那麼它將不會執行.
 一個動作所包含的命令將被依次執行。動作的語法如下所示:
on <trigger>  
  <command>  
  <command>  
  <command> 
動作的使用示例如下:
    on init
    export PATH /sbin:/system/sbin:/system/bin:/system/xbin
    mkdir /system
init表示一個觸發條件,這個觸發事件發生後,進行設定環境變數和建立目錄的操作稱為一個“動作”。

2 服務(services)

服務是指那些需要在系統初始化時就啟動或退出時自動重啟的程式.
它的語法結構如下所示:
service <name> <pathname> [ <argument> ]*  
  <option>  
  <option>  

  ... 

 service bootsound /system/bin/playmp3

    user media
    group audio
    oneshot

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當服務重啟時執行一條指令,

4 觸發器(trigger)

觸發器用來描述一個觸發條件,當這個觸發條件滿足時可以執行動作. 
觸發器描述
boot當init程式執行,並載入/init.conf檔案時觸發.
<name>=<value>當屬性名對應的值設定為指定值時觸發.
device-added-<path>當新增裝置時觸發.
device-removed-<path>當裝置移除時觸發.
service-exited-<name>當指定的服務退出時觸發.

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指令
setkeyTBD(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> ]*往指定的檔案寫字串.
6 屬性(Properties)
init程式在執行時會更新屬性系統的一些屬性,提供程式內部正在執行的資訊.
屬性名描述
init.action當前正在執行的動作,如果沒有則為空字串""
init.command當前正在執行的命令.沒有則為空字串.
init.svc.<name>當前某個服務的狀態,可為"stopped", "running", "restarting"
setprop 用於設定屬性,on property可以用於判斷屬性,這裡的屬性在整個Android系統執行中都是一致的。init指令碼的關鍵字可以參考init程序的system/core/init/keyword.h檔案。init.rc的使用方法,可以參考說明檔案system/core/init/readme.txt。如果想要修改啟動過程只需要修改init.c(system/core/init)或者init.rc裡的內容即可.

四、具體分析

以上說明了init.rc中各個組成部分,這些內容是有固定的執行順序,這個順序由early-init, init, early-boot, boot這四個關鍵字決定。
rc檔案中這4個部分是可以打亂順序隨便寫的,但是解析完了以後的執行順序確實固定的,執行順序如下:early-init -> init -> early-boot -> boot
==================================================================================================================

        既然android是執行在linux之上的,我們可否只啟動linux而不啟動android,這樣的話在不需要圖形介面的裝置中可以大大降低硬體執行要求而提供核心服務。我們可以通過修改init.rc來實現。

        android的系統應用中的一個重要的程序就是zygote,所有的java應用程式程序都是由zygote派生出來的,zygote這個程序的作用就是“生兒子”。zygote程序正是在linux kernel startup後通過這個檔案啟動的,具體看init.rc中這一段:service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server。一段一段的分析這個程式碼:啟動服務名字zygote.   /system/bin/app_process:程序的bin檔案具體路徑,後面跟的就是啟動引數-Xzygote /system/bin --zygote --start-system-server。

==================================================================================================================

       假設要內建的檔名稱為iperf。(1)將iperf放到Codebase的任意一個目錄下(該目錄必須能夠在搜尋Android.mk時被搜尋到),比如system/iperf/iperf。(2)在system/iperf目錄下新增一個Android.mk檔案,內容如下:
LOCAL_PATH:= $(call my-dir)
PRODUCT_COPY_FILES += $(LOCAL_PATH)/iperf:system/iperf/iperf
重新編譯Codebase即可,該檔案將被內建到手機的system/iperf目錄下。注意這種方法禁止複製APK檔案。

==================================================================================================================

         假設,我們通過adb除錯命令調好了一個外設的硬體模組,下一步的動作,需要讓系統開機自動跑這些命令並正常啟動模組的工作。這個時候,就需要用到sh將這些命令組合起來,放到init.rc中就可以實現這個目的(不要放到init.project.rc中,會影響到WIFIBT)。

        出於執行許可權原因,ko檔案可以放到vendor的/system/lib/modules下(不能放到vendor對應的/data目錄,RELEASE版本/data無許可權insmod),可執行檔案包括shell則放到vendor的/system/bin下,這樣確保任何時候都可以執行。

[cpp] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
#!/system/bin/sh  
PKG_DIR=/system/lib/modules  
APP_DIR=/system/bin  

cd $PKG_DIR  
CUR_PKG_DIR=`pwd`  
echo "CUR_PKG_DIR = $CUR_PKG_DIR"  

insmod $PKG_DIR/accel_qlulpsh.ko   
insmod $PKG_DIR/mag_qlulpsh.ko   
insmod $PKG_DIR/gyro_qlulpsh.ko   
insmod $PKG_DIR/pedometer_qlulpsh.ko   
insmod $PKG_DIR/gestures_qlulpsh.ko   
insmod $PKG_DIR/contexts_qlulpsh.ko   

cd $APP_DIR  
CUR_APP_DIR=`pwd`  
echo "CUR_APP_DIR = $CUR_APP_DIR"  

#Program the Sensor hub   
echo "SensorHub Programming using loader APP"  
sleep 1  
./qlulpsh_loader_app -i ./ulpsh_s2_main.shexe -b 1 -s 1 -t 10 -d  
sleep 1  
./qlulpsh_loader_app -c 1 -a 0002  

echo "Starting SensorHub..."  
echo 1 > /sys/devices/virtual/QL_Sensors/qlulpsh/intr_enable  
echo 16 > /sys/devices/virtual/QL_Sensors/qlulpsh/FFE_RunCnt  
sleep 1  

echo "Starting sensorservice..."  
sensorservice &  
注意:(1)兩個可執行檔案前要加./,否則提示可執行檔案not found,需指明當前目錄下。(2)考慮硬體的實際執行情況,sh中有sleep語句,有些讀操作要等待真實硬體初始化OK。(3)sensorservice &啟動安卓系統sensor服務。
        在init.rc中,補上如下語句,用service啟動一個shell。

view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
# SenHub scripts  
        service myshell /system/bin/sensorhub_init.sh  
        oneshot  

五、實際操作

有時候希望在啟動後做點事情,比如在sdcard上建立目錄,修改/data的訪問許可權等,這些都可以放在init.rc中去完成,下面介紹如何來完。
通過下面的例子來講述,實現一個功能:在android系統啟動後,修改/data的訪問許可權為770.
1、完成一個C語言程式chpermission.c,來實現修改許可權的功能。程式碼如下:
     #include <stdlib.h>
      int main()
     {
        system("chmod 700 /data");
         return 0;
     }
    然後編譯此程式,不過需要編譯為android下的可執行程式。
    編譯完後將可執行檔案push到模擬器的/data目錄中去:
     #adb push chpermission /data
     3、 修改init.rc檔案,讓其啟動 chpermission程式, 增加以下程式碼:
     #add by me on 2016-03-15    
     service chpermission   /data/ chpermission 
          oneshot
     用於啟動 chpermission,完成相應的功能--修改data許可權。

相關推薦

Android init.rc語法介紹

一、簡述    Android init.rc檔案由系統第一個啟動的init程式解析,此檔案由語句組成,主要包含了四種類型的語句:Action, Commands,Services, Options. 在init.rc 檔案中一條語句通常是佔據一行.單詞之間是通過空格符來相

Android 8.0 系統啟動流程之init.rc語法規則(六)

1、概述     init經過前兩個階段後,已經建立了屬性系統和SELinux系統,但是init程序還需要執行很多其他的操作,還要啟動許多關鍵的系統服務,但是如果都是像屬性系統和SELinux系統那樣一行行程式碼去做,顯得有點雜亂繁瑣,而且不容易擴充套件,所以

android init.rc檔案語法詳解

初始化語言包含了四種類型的宣告: Actions(行動)、 Commands(命令)、Services(服務)和Options(選項)。 基本語法規定 1 所有型別的語句都是基於行的,一個語句包含若干個tokens,token之間通過空格字元分隔. 如果一個token中需

Android Init Language語法概述

init.rc概述   init.rc是Androrid的可配置初始化檔案,其由init負責解析,在定製開發下可在init.rc中新增指令來改變系統啟動過程。此配置檔案使用的Android Init Language是一種類C風格的程式語言,主要由Actions

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 language)

Android 初始化語言由四大類宣告組成 : 行為類 (Actions), 命令類 (Commands) ,服務類 (Services), 選項類 (Options). 初始化語言以行為單位,由以空格間隔的語言符號組成。 C 風格的反斜槓轉義符可以用

Android init.rc on property

在 init.rc 中,可以見到下面類似的用法,當一個屬性值等於XX時,觸發下面的事件,比如啟動一個程序,或者設定列印級別 on property:sys.init_log_level=*  

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 init.rc檔案淺析

本文主要來自$ANDROID_SOURCE/system/init/readme.txt的翻譯. 1 簡述 Android init.rc檔案由系統第一個啟動的init程式解析,此檔案由語句組成,主要包含了四種類型的語句:Action,Commands,Services,O

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 ,以及

Androidinit.rc 檔案簡介

init.rc由許多的Action和Service組成。每一個語句佔據一行,並且各個關鍵字被空格分開. 由 # (前面允許有空格)開始的行都是註釋行(comment) 一個actions 或 services 的開始隱含聲明瞭一個新的段,所有commands 或 option

Androidinit.rc中加入指令碼開機安裝APK並啟動APK的服務

要求:開機檢查APK是否安裝,如果不安裝則自動靜默安裝,同時啟動APK的服務。 把要安裝的APK放在device資料夾下,編譯時用指令碼拷貝到out目錄下,開機啟動指令碼安裝APK並啟動服務。 這裡以Airplay.apk為例。 1.在device目錄下建立資料夾Ai

Android 7.0 init.rc 執行shell指令碼 ---- 製作一初始化配置檔案

最近在一個Android 7.0 PDA專案中遇到如下需求:初始化一配置檔案,此配置檔案需要儲存到data分割槽供系統服務和第三方應用進行讀寫操作,另外此配置檔案在系統重啟後保持檔案內容不變,除非恢復出廠才可以恢復成預設配置引數 。因為初始化的配置引數為了方便其它同事修改

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

Android系統初始化指令碼init.rc分析

位置sytem/core/rootdir 如果裝置商有其他的啟動個性化需求,可以參考HTC 的實現,相關的程式碼位於vendor\htc\dream-open\ init.trout.rc檔案中。(device/lenovo/apollo_td/init_sdmmc.rc)

Android 啟動載入jar包 init.rc BOOTCLASSPATH

一直在研究 Dalvik 的實現,今天突然想起一件事情,我們預設可以用 java.lang.Object 等系統類,他是在什麼時候被載入進來了呢,我們自己的類是否可以這樣預先載入進去呢? 順著這個思路,再回顧一下原來對 Zygote 啟動時的流程,探索一番!

Android啟動流程分析(七) init.rc的解析

############################################# 本文為極度寒冰原創,轉載請註明出處 ############################################# Init.rc的解析過程是筆者認為在andro