Android Init.rc: 啟動過程中的初始化工作

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
RBMC的頭像RBMC
上一篇 2024-10-10 09:28
下一篇 2024-10-10 09:28

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • Git config命令用法介紹:用正確的郵箱保障開發工作

    本文將詳細介紹如何使用git config命令配置Git的全局和本地用戶信息,特別是如何正確使用用戶郵箱,保障Git操作的正常進行。 一、git config命令介紹 Git中的每…

    編程 2025-04-29
  • 自學Python能否找到工作

    自學Python的人越來越多,大家都知道Python是一門很受歡迎的語言,但是很多人還是會擔心自學Python後能否找到工作。那麼,從以下幾個方面來分析一下自學Python能否找到…

    編程 2025-04-28
  • 學Python可以應聘哪些工作?

    Python是近年來最熱門的編程語言之一,它具有簡潔易學、高效靈活等特點,廣泛應用於數據分析、人工智能、爬蟲、Web開發等領域。下面將從不同方面介紹,學Python後可以應聘哪些工…

    編程 2025-04-28
  • Go中struct的初始化

    本文將從多個方面詳細闡述Go中struct的初始化方式,包括使用字面量初始化、使用new函數初始化以及使用構造函數等。通過本文的介紹,讀者能夠更深入的了解Go中struct的初始化…

    編程 2025-04-28
  • 類加載的過程中,準備的工作

    類加載是Java中非常重要和複雜的一個過程。在類加載的過程中,準備階段是其中一個非常重要的步驟。準備階段是在類加載的連接階段中的一個子階段,它的主要任務是為類的靜態變量分配內存,並…

    編程 2025-04-28
  • Android ViewPager和ScrollView滑動衝突問題

    Android開發中,ViewPager和ScrollView是兩個常用的控件。但是當它們同時使用時,可能會發生滑動衝突的問題。本文將從多個方面介紹解決Android ViewPa…

    編程 2025-04-28
  • Python工作需要掌握什麼技術

    Python是一種高級編程語言,它因其簡單易學、高效可靠、可擴展性強而成為最流行的編程語言之一。在Python開發中,需要掌握許多技術才能讓開發工作更加高效、準確。本文將從多個方面…

    編程 2025-04-28
  • Android如何點擊其他區域收起軟鍵盤

    在Android應用中,當輸入框獲取焦點彈出軟鍵盤後,我們希望能夠點擊其他區域使軟鍵盤消失,以提升用戶體驗。本篇文章將說明如何實現這一功能。 一、獲取焦點並顯示軟鍵盤 在Andro…

    編程 2025-04-28
  • Android Studio HUD 實現指南

    本文將會以實例來詳細闡述如何在 Android Studio 中使用 HUD 功能實現菊花等待指示器的效果。 一、引入依賴庫 首先,我們需要在 build.gradle 文件中引入…

    編程 2025-04-27

發表回復

登錄後才能評論