如何去寫 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.rc和init.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系統那樣一行行程式碼去做,顯得有點雜亂繁瑣,而且不容易擴充套件,所以
Android 的 init.rc 檔案簡介
init.rc由許多的Action和Service組成。每一個語句佔據一行,並且各個關鍵字被空格分開. 由 # (前面允許有空格)開始的行都是註釋行(comment) 一個actions 或 services 的開始隱含聲明瞭一個新的段,所有commands 或 option
Android在init.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