1. 程式人生 > >【Android7.1.2原始碼解析系列】實戰分析init.rc檔案

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

實戰分析init.rc檔案

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

一、綜述

1rc檔案語法綜述:

首先丟擲一個結論:

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

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

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

Init.rc檔案是android

當中的啟動指令碼檔案,語法非常的簡單,可以認為init.rc檔案中只有actionservice兩種內容形式,對這兩種內容分別給出一個例子:

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的觸發條件,後面的command1command2等等就是當***條件觸發後將會執行的命令。

以此處的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 coreuser systemgroup systemcritical設定了service所處的類別、使用者、使用者組、以及嚴重的級別,這些是針對於程序屬性的配置,這裡先不管。後面的多個onrestart語句就是該程式能造成的觸發結果,後面的幾句onrestart的意思就是當此service重啟的時候,重新啟動healthdzygotemediasurfaceflingerdrm程序。

二、init.rc分析

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

Init.rc的主要步驟:

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

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

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

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

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

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

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

三、總結

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

相關推薦

Android7.1.2原始碼解析系列實戰分析init.rc檔案

實戰分析init.rc檔案 前言:經過上一篇的/system/core/init/readme.txt檔案的翻譯,對於init.rc的語法也有了一定的瞭解,這一篇就對/system/core/rootdir/init.rc檔案進行一個分析,希望能夠藉此對android的開

Android7.1.2原始碼解析系列android init目錄下的Android.mk編譯檔案分析

上一篇文章對於原始碼中的安卓編譯系統文件進行了翻譯,本文就以android當中的init模組作為例子,對其中的Android.mk檔案進行分析,讀者可以在閱讀本文的同時檢視我的譯文:http://blog.csdn.net/class_brick/article/detai

Spring Security Web 5.1.2 原始碼解析 -- HttpSessionSecurityContextRepository

Spring Security Web提供的類HttpSessionSecurityContextRepository是一個SecurityContextRepository介面的實現,用於在HttpSession中儲存安全上下文(security context),這樣屬於同一個Htt

Spring Security Config 5.1.2 原始碼解析 -- 工具類 AutowireBeanFactoryObjectPostProcessor

概述 Spring Security的配置機制會使用到很多物件,比如WebSecurity,ProviderManager,各個安全Filter等。這些物件的建立並不是通過bean定義的形式被容器發現和註冊進入容器的。而是由Spring Security配置機制使用Java new操

Spring Security Web 5.1.2 原始碼解析 -- 安全相關Filter清單

名稱 簡介 WebAsyncManagerIntegrationFilter TODO SecurityContextPersistenceFilter

Spring Security Web 5.1.2 原始碼解析 -- DefaultWebSecurityExpressionHandler 預設Web安全表示式處理器

概述 DefaultWebSecurityExpressionHandler是Spring Security Web用於Web安全表示式處理器(handler)。它會基於一組預設配置,和當時的環境,對指定的Web安全表示式求值。 DefaultWebSecurityExpress

Spring Security Web 5.1.2 原始碼解析 -- SessionManagementFilter

概述 該過濾器會檢測從當前請求處理開始到目前為止的過程中是否發生了使用者登入認證行為(比如這是一個使用者名稱/密碼錶單提交的請求處理過程),如果檢測到這一情況,執行相應的session認證策略(一個SessionAuthenticationStrategy),然後繼續繼續請求的處理。

Spring Security Web 5.1.2 原始碼解析 -- AnonymousAuthenticationFilter

概述 此過濾器過濾請求,檢測SecurityContextHolder中是否存在Authentication物件,如果不存在,說明使用者尚未登入,此時為其提供一個匿名Authentication物件:AnonymousAuthentication。 注意:在整個請求處理的

Spring Security Web 5.1.2 原始碼解析 -- RequestCacheAwareFilter

概述 Spring Security Web對請求提供了快取機制,如果某個請求被快取,它的提取和使用是交給RequestCacheAwareFilter完成的。 系統在啟動時,Spring Security Web會首先嚐試從容器中獲取一個RequestCache bean,獲取

Spring Security Web 5.1.2 原始碼解析 -- HttpSessionRequestCache

概述 Spring Security Web認證機制(通常指表單登入)中登入成功後頁面需要跳轉到原來客戶請求的URL。該過程中首先需要將原來的客戶請求快取下來,然後登入成功後將快取的請求從快取中提取出來。 針對該需求,Spring Security Web 提供了在http se

Spring Security Core 5.1.2 原始碼解析 -- PasswordEncoderFactories

概述 PasswordEncoderFactories是Spring Security建立DelegatingPasswordEncoder物件的工廠類。該工廠所建立的DelegatingPasswordEncoder預設使用bcrypt用於加密,並且能夠用於匹配以下幾種密碼型別 :

Spring Security Web 5.1.2 原始碼解析 -- RememberMeAuthenticationFilter

概述 預設情況下,如果安全配置開啟了Remember Me機制,使用者在登入介面上會看到Remember Me選擇框,如果使用者選擇了該選擇框,會導致生成一個名為remember-me,屬性httpOnly為true的cookie,其值是一個RememberMe token。

Spring Security Web 5.1.2 原始碼解析 -- DefaultLogoutPageGeneratingFilter

概述 DefaultLogoutPageGeneratingFilter用於生成一個預設的使用者退出登入頁面,預設情況下,當用戶請求為GET /logout時,該過濾器會起作用,生成並展示相應的使用者退出登入表單頁面。使用者點選其中的表單提交按鈕會提交使用者退出登入請求到POST /

Spring Security Web 5.1.2 原始碼解析 -- DefaultLoginPageGeneratingFilter

概述 當開發人員在安全配置中沒有配置登入頁面時,Spring Security Web會自動構造一個登入頁面給使用者。完成這一任務是通過一個過濾器來完成的,該過濾器就是DefaultLoginPageGeneratingFilter。 該過濾器支援兩種登入情景: 使用

Spring Security Web 5.1.2 原始碼解析 -- UsernamePasswordAuthenticationFilter

概述 該過濾器會攔截使用者請求,看它是否是一個來自使用者名稱/密碼錶單登入頁面提交的使用者登入認證請求,預設使用的匹配模式是:POST /login。預設情況下,如果是使用者登入認證請求,該請求就不會在整個filter chain中繼續傳遞了,而是會被當前過濾器處理並進入響應使用者階

Spring Security Web 5.1.2 原始碼解析 -- ExceptionTranslationFilter

概述 該過濾器的作用是處理過濾器鏈中發生的 AccessDeniedException 和 AuthenticationException 異常,將它們轉換成相應的HTTP響應。 當檢測到 AuthenticationException 異常時,該過濾器會啟動 authentic

Spring Security Web 5.1.2 原始碼解析 -- BasicAuthenticationFilter

概述 處理HTTP請求中的BASIC authorization頭部,把認證結果寫入SecurityContextHolder。 當一個HTTP請求中包含一個名字為Authorization的頭部,並且其值格式是Basic xxx時,該Filter會認為這是一個BASIC aut

java集合框架原始碼剖析系列java原始碼剖析之HashMap

前言:之所以打算寫java集合框架原始碼剖析系列部落格是因為自己反思了一下阿里內推一面的失敗(估計沒過,因為寫此部落格已距阿里巴巴一面一個星期),當時面試完之後感覺自己回答的挺好的,而且據面試官最後說的這幾天可能會和你聯絡來看當時以為自己一面應該是通過的,但是事與願違,痛定

jquery 1.7.2原始碼解析(二)構造jquery物件

構造jquery物件 jQuery物件是一個類陣列物件。 一)建構函式jQuery() 建構函式的7種用法:   1.jQuery(selector [, context ]) 傳入字串引數:檢查該字串是選擇器表示式還是HTML程式碼。如果是選擇器表示式,則遍歷文件查詢匹配的DOM元

USACO 1.2 Name That Number 解題報告

\(注意 該篇題解為本人較早時期寫的題解 所以會很傻 直接能用map 以string為下標偏偏要繞彎兒 有時間改一改QAQ\) [USACO1.2]Name That Number 題目描述 在威斯康辛州牛守志大農場經營者之中,都習慣於請會計部門用連續數字給母牛打上烙印。但是,母牛本身並沒感到這個系統的