1. 程式人生 > >如何去寫 Android init.rc (Android init language)

如何去寫 Android init.rc (Android init language)

Android 初始化語言由四大類宣告組成 : 行為類 (Actions), 命令類 (Commands) ,服務類 (Services), 選項類 (Options).

  • 初始化語言以行為單位,由以空格間隔的語言符號組成。

    C 風格的反斜槓轉義符可以用來插入空白到語言符號。
    雙引號也可以用來防止文字被空格分成多個語言符號。
    當反斜槓在行末時,作為折行符。

  • 以 # 開始 ( 前面允許有空格 ) 的行為註釋行。

  • Actions 和 Services 隱含宣告一個新的段落。

    所有該段落下 Commands 或 Options 的宣告屬於該段落。
    第一段落前的 Commands 或 Options 被忽略。

  • Actions 和 Services 擁有獨一無二的命名。在它們之後宣告相同命名的類將被當作錯誤並忽略。

Actions

Actions 是一系列命令的命名。 Actions 擁有一個觸發器 (trigger) 用來決定 action 何時執行。當一個 action 在符合觸發條件被執行時,如果它還沒被加入到待執行佇列中的話,則加入到佇列最後。

佇列中的 action 依次執行, action 中的命令也依次執行。 Init 在執行命令的中間處理其它活動 ( 裝置建立 / 銷燬 ,property 設定,程序重啟 ) 。

Actions 表現形式為:

on

Services

Services 是由 init 啟動 ,在它們退出時重啟 ( 可選 ) 。 Service 表現形式為 :

service [ ]*

Options

Options 是 Services 的修飾,它們影響 init 何時、如何執行 service .

critical

 這是一個裝置關鍵服務 (device-critical service) . 如果它在 4 分鐘內退出超過 4 次,裝置將重啟並進入恢復模式。

disabled

 這個服務的級別將不會自動啟動,它必須被依照服務名指定啟動才可以啟動。

setenv

 設定已啟動的程序的環境變數 <name> 的值 <value>

socket [ [ ] ]

 建立一個名為 /dev/socket/<name> 的 unix domin socket ,並傳送它的 fd 到已啟動的程序。 <type> 必須為 "dgram" 或 "stream". 使用者和組預設為 0.

user

 在執行服務前改變使用者名稱。當前預設為 root. 如果你的程序需要 linux 能力,你不能使用這個命令。你必須在還是 root 時請求能力,並下降到你需要的 uid.

group [ ]*

 在執行服務前改變組。在第一個組後的組將設為程序附加組 ( 通過 setgroups()). 當前預設為 root.

oneshot

 在服務退出後不重啟。

class

 為 service 指定一個類別名。同樣類名的所有的服務可以一起啟動或停止。如果沒有指定類別的服務預設為 "default" 類。

onrestart

   當服務重啟時執行一個命令。

Triggers

 Triggers( 觸發器 ) 是一個字串,可以用來匹配某種型別的事件並執行一個 action 。

boot

 這是當 init 開始後執行的第一個觸發器 ( 當 /init.conf 被載入 )

=

 當 property <name> 被設為指定的值 <value> 時觸發。

device-added-

device-removed-

 當裝置節點被新增或移除時觸發。

service-exited-

 當指定的服務存在時觸發

Commands

exec [ ]*

 Fork 並執行一個程式 (<path>). 這將被 block 直到程式執行完畢。最好避免執行例如內建命令以外的程式,它可能會導致 init 被阻塞不動。

export

 設定全域性環境變數 <name> 的值 <value> ,當這個命令執行後所有的程序都可以取得。

ifup

 使網路介面 <interface> 聯機。

import

 解析一個 init 配置檔案,擴充套件當前配置檔案。

hostname

 設定主機名

chmod

 改變檔案訪問許可權

chown

 改變檔案所屬和組

class_start

 當指定類別的服務沒有執行,啟動該類別所有的服務。

class_stop

 當指定類別的服務正在執行,停止該類別所有的服務。

domainname

 設定域名。

insmod

 載入該路徑 <path> 的模組

mkdir [mode] [owner] [group]

 在 <path> 建立一個目錄 , 可選選項 :mod,owner,group. 如果沒有指定,目錄以 755 許可權, owner 為 root,group 為 root 建立 .

mount

[ ]*
 嘗試 mount <device> 到目錄 <dir>. <device> 可以用 [email protected] 格式以命名指定一個 mtd 塊裝置。 <mountoption> 包含 "ro","rw","remount","noatime".

setkey

 暫時沒有

setprop

 設定系統 property <name> 的值 <value>.

setrlimit

 設定 resource 的 rlimit.

start

 啟動一個沒有執行的服務。

stop

 停止一個正在執行的服務 。

symlink

 建立一個 <path> 的符號連結到 <target>

sysclktz

 設定系統時區 (GMT 為 0)

trigger

 觸發一個事件。用於呼叫其它 action 。

write [ ]*

 開啟 <path> 的檔案並寫入一個或多個字串。

Properties

Init 會更新一些系統 property 以提供檢視它正在幹嘛。

init.action

 當前正在執行的 action, 如果沒有則為 ""

init.command

 被執行的命令,如果沒有則為 ""

init.svc.

 命名為 <name> 的服務的狀態 ("stopped", "running", "restarting")

init.rc 示例 :

not complete – just providing some examples of usage

#

on boot

export PATH /sbin:/system/sbin:/system/bin

export LD_LIBRARY_PATH /system/lib

mkdir /dev

mkdir /proc

mkdir /sys

mount tmpfs tmpfs /dev

mkdir /dev/pts

mkdir /dev/socket

mount devpts devpts /dev/pts

mount proc proc /proc

mount sysfs sysfs /sys

write /proc/cpu/alignment 4

ifup lo

hostname localhost

domainname localhost

mount yaffs2 [email protected] /system

mount yaffs2 [email protected] /data

import /system/etc/init.conf

class_start default

service adbd /sbin/adbd

user adb

group adb

service usbd /system/bin/usbd -r

user usbd

group usbd

socket usbd 666

service zygote /system/bin/app_process -Xzygote /system/bin –zygote

socket zygote 666

service runtime /system/bin/runtime

user system

group system

on device-added-/dev/compass

start akmd

on device-removed-/dev/compass

stop akmd

service akmd /sbin/akmd

disabled

user akmd

group akmd

除錯

預設情況下, init 執行的程式輸出的資訊和錯誤到 /dev/null. 為了 debug ,你可以通過 Android 程式 logwrapper 執行你的程式。這將復位向輸出 / 錯誤輸出到 Android logging 系統 ( 通過 logcat 訪問 ) 。

例如

service akmd /system/bin/logwrapper /sbin/akmd

相關推薦

如何 Android init.rc (Android init language)

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

Android修改init.rcinit.xx.rc檔案

一、檔案簡介 init.rc:Android在啟動過程中讀取的啟動指令碼檔案,主要完成一些初級的初始化,在/system/core/init/init.c中解析。 init.xx.rc:與具體CPU相關的啟動指令碼,比如對於飛思卡爾的CPU,名字為init.freescal

[init.rc] android開機過程執行shell指令碼

1、在system/core/rootdir/etc/下新增指令碼檔案,命名為myshell.sh,指令碼內容可如下         #! /system/bin/sh 2、修改system/core/rootdir/Android.mk檔案,增加語句         co

Android如何配置init.rc中的開機啟動程序(service)

轉載。 http://blog.csdn.net/qq_28899635/article/details/56289063 開篇:為什麼寫這篇文章 先說下我自己的情況,我是個普通的學生,之前在學校一直做Android應用開發,找實習的時候也一直想找相關的工作,來到現在這家公司以

Android init.rc 筆記(概況及init.rc文法)

Android的根目錄下有一系列非常重要的配置檔案,即:init.rc init.xxxxx.rc Android中解析這些配置檔案的程式碼在:system\core\init目錄下。 核心檔案是init.c,相關的文法說明請參見:readme.txt 本文簡單介紹一下i

Android 8.0 系統啟動流程之init.rc解析與service流程(七)

1、概述     上一篇文章中我們介紹了一下init.rc檔案中的語法規則,而本文將分析如何解析rc檔案,並對rc檔案中的某一service啟動過程進行分析。 2、解析.rc檔案 之前我們在文件中看到.rc檔案主要有根目錄下的 /init.rc ,以及

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

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

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 init.rc語法介紹

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

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

Android init.rc on property

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

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

############################################# 本文為極度寒冰原創,轉載請註明出處 ############################################# 在分析完解析init.rc的action之後,剩

android init.rc檔案語法詳解

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

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