Android系統啟動時,第一個要執行的程序就是/system/core/init/init.rc腳本。這個腳本被稱為「init腳本」,是Android啟動過程中最重要的一部分。它負責初始化各種系統組件、啟動系統服務,以及處理開機自啟動的應用程序等。
一、init.rc腳本的結構
init.rc腳本的結構非常簡單,它由一系列的Action和Command組成,如下所示:
# This file is read once by the init process to set up the system environment # variables and services. … on early-init … on init … on post-fs … on boot … on property:sys.boot_completed=1 … on property:dev.bootcomplete=1 … on property:selinux.restorecon_recursive=1 …
這些Action和Command分別代表不同的執行環節,在系統啟動過程中按照一定的順序執行。具體來說,它們的含義如下:
- on early-init:系統從內核啟動後馬上執行的內容
- on init:文件系統被掛載後、Zygote啟動之前的內容
- on post-fs:Zygote啟動之後的內容
- on boot:啟動所有應用程序之前的內容
- on property:sys.boot_completed=1:啟動後等待系統初始化完成時執行的內容
- on property:dev.bootcomplete=1:啟動後等待設備初始化完成時執行的內容
- on property:selinux.restorecon_recursive=1:在SELinux恢復標籤之後執行的內容
這些環節依次執行,保證了系統各個組件的正確初始化和啟動順序。
二、Action和Command
2.1 Action
Action是Init語言中最基本的控制結構,它支持if語句、while語句、switch語句等語法。Action的語法如下:
action_name { command command command }
其中,action_name是一個標誌符,用來標識一個Action,在後面的Trigger中可以進行引用;command則表示Action要執行的命令。
一個Action可以包含多個Command,它們按照從上到下的順序逐個執行。每個Command都可以是一個Shell命令,也可以是系統服務管理命令(如start、stop、restart等)。
2.2 Command
Command是Action的組成部分,它指定了Init進程要執行的命令。Command語法如下:
command [args]
其中,command可以是Shell命令,也可以是系統服務管理命令。
在Init腳本中,常見的命令包括:
- start service_name:啟動一個系統服務
- stop service_name:停止一個系統服務
- restart service_name:重啟一個系統服務
- write filename string:將一個字符串寫入文件
- setprop property_name property_value:設置一個系統屬性
三、實例代碼片段
下面是一個Init腳本中的代碼片段,它通過一個Action來啟動Zygote進程:
on init # Set up some memory management write /proc/sys/vm/overcommit_memory "1" # Create some mountpoints and tmpfs filesystems mkdir /dev/socket 0775 system system mkdir /dev/log 0777 root log mkdir /dev/cpuctl mount tmpfs tmpfs /dev/cpuctl mode=0770,gid=1000 mkdir /dev/cpuctl/bg_non_interactive mkdir /dev/cpuctl/fg_boost mkdir /dev/cpuctl/fg_non_interactive mount cgroup none /sys/fs/cgroup/cpuacct,cpu mode=0755 mount cgroup none /sys/fs/cgroup/memory mode=0755 # ...省略其他內容... # Start up the system start ueventd class_start default start servicemanager start vold start zygote start media
以上代碼片段,先創建了一些掛載點和臨時文件系統,然後使用start命令啟動了一些系統服務,最終啟動了Zygote進程。
四、總結
Android Init.rc腳本是Android系統啟動過程中最重要的一部分。它通過一系列的Action和Command來負責系統初始化、系統服務啟動和應用程序管理等任務。了解Init.rc的語法和結構對於深入理解Android系統啟動過程和進行系統定製具有重要意義。
原創文章,作者:RBMC,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/142166.html