天天看點

【Android7.1.2源碼解析系列】實戰分析init.rc檔案實戰分析init.rc檔案

實戰分析init.rc檔案

前言:經過上一篇的/system/core/init/readme.txt檔案的翻譯,對于init.rc的文法也有了一定的了解,這一篇就對/system/core/rootdir/init.rc檔案進行一個分析,希望能夠借此對android的開機過程有一定的了解。

關聯文章:init.rc文法翻譯、init.rc全流程分析注釋

一、綜述

1、rc檔案文法綜述:

首先抛出一個結論:

action是“觸發器-執行功能”一對多的關系,一個觸發條件然後執行多個程式。

Service是“觸發器-執行功能”多對一的關系,針對于一個程式來設定多個觸發的目标。

基于這個基礎的認知,對于init.rc文法的學習就比較簡單了。

Init.rc檔案是android當中的啟動腳本檔案,文法非常的簡單,可以認為init.rc檔案中隻有action和service兩種内容形式,對這兩種内容分别給出一個例子:

Action:

on init

# 設定系統時鐘

    sysclktz 0

# 設定日志等級

    loglevel 3

    # Backward compatibility

# 直譯,增強相容性

# 将system/etc連結到/etc,将sys/kernel/debug連結到/d

    symlink system/etc /etc

symlink sys/kernel/debug /d

……(省略後半部分)

說明:action中,文法為:

on ***

Command1

Command2

...

此處,***就是action的觸發條件,後面的command1、command2等等就是當***條件觸發後将會執行的指令。

以此處的on init為例,當系統處于初始化時,觸發了init條件(這裡先不管init怎麼觸發的),于是開始執行以下指令symlink system/etc /etc 建立兩個目錄的符号連結,同樣的下一句symlink也是建立兩個目錄之間的符号連結。這樣再依次執行以後省略号之中的内容。

Service:

service servicemanager /system/bin/servicemanager

    class core

    user system

    group system

    critical

    onrestart restart healthd

    onrestart restart zygote

    onrestart restart media

    onrestart restart surfaceflinger

    onrestart restart drm

說明:service中,文法為:

Service 名稱 路徑

描述1

描述2

...

如同之前提到的,與action不同,service是由多個條件觸發一個行為,而這裡的名稱就是所要執行的檔案的名稱,路徑是此檔案所位于的路徑,而描述1、描述2就是此檔案運作的時機和條件(不完全是,有一部分是對于檔案的分類、權限、等級的描述等,這裡先不管)。

以此處的service為例,servicemanager所處的位置位于/system/bin/servicemanager,後面的class core、user system、group system、critical設定了service所處的類别、使用者、使用者組、以及嚴重的級别,這些是針對于程序屬性的配置,這裡先不管。後面的多個onrestart語句就是該程式能造成的觸發結果,後面的幾句onrestart的意思就是當此service重新開機的時候,重新啟動healthd、zygote、media、surfaceflinger、drm程序。

二、init.rc分析

對于init.rc檔案的全面分析已經在之前的文章當中做過了,想要看的同學可以點選這裡進行檢視,而此處是對于init.rc的總體流程進行分析,如果有疑問或不清楚的地方歡迎留言進行讨論。

Init.rc的主要步驟:

1、導入其他預配置rc檔案

2、進行early-init,設定init程序的資訊(包括優先級、權限、selinux配置),開啟ueventd。early-init的主要工作是對init程序進行初始化。

3、Init部分建立了一些目錄結構,對于檔案進行挂載,然後對于系統中的記憶體與程序進行了配置,cpu運作的資料以及一些權限的管理。總的來說,init部分主要進行了android目錄下大的檔案夾的建立工作,包括system、data、cache、config、/mnt/storage(sdcard),對于系統的記憶體配置、程序配置、權限配置進行了初始化。這裡可以得知,對于作業系統來說,最基本的還是檔案,是以init部分也是首先初始化了檔案的分類存放位置,然後對于一些必要的可選項進行了配置,而配置的方式依然是寫入檔案當中。

4、設定有關充電模式的内容

5、Init-late部分,主要是建立更深層次的子目錄并建立對應的資料。

總結一下:前五步可以說就是所有action當中的内容,我們可以看出,action部分主要完成了以下的工作:配置系統的檔案目錄結構與資料、配置系統的記憶體管理、程序管理以及權限管理的資料。 可以說,action部分是一些靜态的配置,而接下來的service部分就是一些動态的程序的配置了。

6、對于動态程序的部分,程序很多,觸發條件也很多,就不一一贅述了,而這些程序主要按照分級、分類、分依賴三種劃分方式進行劃分,其中分級指的是對于程序的關鍵性的分級,比如critical辨別的程序就是關鍵性的程序,發生錯誤時會造成系統的嚴重錯誤。而分類指的是将程序的功能進行分類,比如屬于core類别、屬于healthd類别等。而分依賴指的是說明了程序當中的互相依賴關系,而init.rc檔案中service的編寫就是主要展現了這種劃分的方式。

三、總結

Android系統博大精深,對于init過程的梳理非常有助于對其整體架構的了解,而在init過程當中,大量的檔案操作,也加深了我對于系統中“萬物皆檔案”這一思想的了解。學習過程中也應該更加積極的思考,對于android系統中每個部分的運作在了解它的存在的方式的同時,還要了解它的存在的原因,也就是它設計的思想,保持積極的思考。