Android 基礎組件構成系統分層以及底層啓動原理

一、一套最基礎的安卓設備(開發版)應包含的組件

這裏寫圖片描述

二、芯靈思開發板預覽

這裏寫圖片描述

第一口 UART ,這個比adb命令更加方便我們的工程師去抓取一些log
第二個 是LED燈
第三個 是SD卡 因爲SD卡的讀寫速度較慢,如果將系統寫入SD卡將大大影響我們的系統流暢程度
第四個 是Camera與WIFI接口,並且預留了一組GPL,這樣我們就可以使用GPL掛載一些其他的外設,比方sensor紅外之類的
第五個 是一個網線插口,這個開發板並沒有直接提供WIFI
第六個 這裏提供了一個OTG和兩個USB接口
第七個 是LCD和HDMI接口

核心區域

1.主CPU A31S
2. DDR 1G
3.我們的FLash 也就是我們的EMMC 16G
4.這就是我們的PMU 電池管理芯片

這就是一塊最簡單的開發板外圍接口和核心部分的簡介

三、Android整個系統架構和分層

這裏寫圖片描述

1.Android整個系統是由軟件和硬件組成的

硬件第一個是指我們的主CPU,主CPU裏有cache有MMU還有GPU和各種總線,這是由CPU的開發商給我們準備的。
手機芯片開發商有 高通-驍龍系列、聯發科-MTK系列、海思-麒麟系列
當我們拿到一款CPU,瞭解到它的,基本接口之後,我們就需要拿它去做一些外圍的設計
我們所說的外圍的設計包括:Sensor的造型、Camera的造型、LCD WIFI等等以及存儲空間的大小,這些都是由我們硬件工程師來決定的,但是我們的軟件工程師也會給一些參考意見,當我們把整個硬件確定完之後,我們再來看軟件方面的工作。

2.軟件的工作從底層到上層可以分爲這麼幾個部分

第一個是Uboot
第二個是內核
第三個是Android OS
Uboot的作用就是引導內核的啓動,它首先會把我們的內核從FLash中搬到內存中引導內核啓動
有這麼一個問題,Uboot是如何被引導的呢?
這個由主CPU完成的,cpu裏也會有一段引導程序,並且有一段固化的ROM,這個是由芯片廠商來完成的,我們的芯片提供廠商通常都會給我們提供幾種啓動模式,從USB啓動,從SD卡啓動或者從FLash啓動,如何啓動也是有它幾個GPL的電頻來決定的。
比如我們把它固定的GPL進行上拉或者下拉就可以配對成這種選擇
如果我們配置從Flash啓動,那麼當我們雙亮的時候,我們這一段引導程序就會從Flash中去引導我們的Uboot,從而完成我們Uboot的啓動

3.內核是整個系統的核心

內核負責我們進程的管理,內存的管理,網絡的管理,它可以直接對我們的硬件進行控制,並且把我們的硬件全部抽象成文件,對上層提供接口,當我們內核啓動完成之後,就會根據我們所設置的參數去啓動android系統

4.Android軟件層分層

第一個是我們的Hal層
第二個是我們的Framework(C++)層
第三個是我們的第三方的一些庫文件
第四個是我們的虛擬機系統
第五個是我們的Framework(Java)層
第六個是我們的應用層
其中HAL層的主要作用就是把我們的一些主要外設抽象出一套標準的接口供我們的Framework(C++)層調用。
比方說我會把我們的Camera抽象出來一套接口,如果說我們的底層換了Camera之後呢,我們Camera和C++ Framework層它們之間的接口是不會發生改變的。我所要修改的就是Hal層調用我們驅動的方式會發生一些改變,但是Framework到Hal層他們之間的接口是不會改變的
我們的Framework C++層主要是起一個承上啓下的作用,對上也就是 Framework Java層,它提供服務,對下它能夠掛接我們的Hal層,比如說我們的Camera Sensor Audio WIFI等外設,並且對我們這些外設提供一個保護,比如說我們上層有兩個程序同時對Camera進行訪問,但是呢,我們這裏同一時刻只能有一個應用對我們的Camera進行訪問,那我們的Framework現在就會有一種機制去管理這種訪問確保在同一時刻只有一個應用程序對我們的Camera進行訪問。

5.三方庫

Android是一個龐大的系統,它同時引入了很多第三方開源的庫。比如說LibJPerk,LibJPng,Scaya,Webkit等等,這些庫也主要是爲我們系統提供一些處理。

6.Dalvik虛擬機

Dalvik虛擬機主要是連接我們上層應用,我們底層的服務,我們的第三方庫,提供一個自動化的管理尤其是我們的內存的一個管理。
有了Dalvik虛擬機虛擬機之後,我們就可以使用Java去寫我們相關的應用,我們用Java寫應用的效率和代碼的複用性要比C和C++高很多。

7.Framework(Java)

Framework(Java)層爲我們提供了ActivityManager,WindowsManager,PackageManager,SensorManager等並提供了電源管理。WIFI管理等一系列的服務,並且Android還提供了相關的Activity以及進程間通訊的一些方式。
這些Activity通訊的方式,管理系統和服務足夠支撐我們快速的創建出我們自己的應用,並且這些代碼全是開源的,我們也可以根據自己的需求去定製我們所需要的控件。

8.App應用層

我們的應用是基於java來實現的,運行在我們的虛擬機上,而且我們每一個進程對我們的訪問權限也是有要求的。

9.以Camera爲例分析應用從上到下的代用順序

我們的應用程序想要拍張照片,首先,它要去獲取我們的Camera服務,那麼就會從我們的應用層調到我們的Framework java層,Framework java層通過虛擬機直接獲取我們的Camera服務。
如果當前我們的Camera服務有人在佔用,那我們就會斷開當前的連接,同時和我們新的應用建立一個連接,這樣我們的應用就能獲取我們Camera的訪問權限,並且獲取我們Camera獲取的一些屬性。
然後我們的Camera服務和Hal層建立了關係。這樣當我們點擊一個拍照命令,那麼我們的命令一直會從上層到我們的CameraService告訴我們的Camera Hal層。
Hal層就會直接調用我們的驅動去控制我們的硬件去抓拍一張照片,我們的照片拿到的數據就會經過我們ISB處理然後返回給我們的Camera Service,再從Service通過我們的Dalvik虛擬機傳遞給我們上層。
然後我們上層拿到圖片就可以做一些處理,比方說做一些預覽,或者直接存儲到我們的Flash或者SD卡中。

這就是android每層和每層之間的一個大概的聯繫

四、Android系統啓動過程

這裏寫圖片描述

首先是上電
接下來是bootloader,這個bootloader是生產時就已經燒錄好的,它會根據我們的硬件以及GPL的設置來判斷我們的系統是在U盤還是在SD卡以及我們的UFlash中啓動
去引導我們的Uboot
我們的Uboot主要是初始化一些相關的外設,比方說內存,我們的Flash,以及我們CPU的一些IO,並且通過串口給我們提供一些修改啓動參數的配置過程並且根據我們所配置的一個參數去引導內核啓動。
當我們的內核被引導起來之後,內核還是初始化一些外設,比方說我們的系統的一個主頻,我們內存,我們Flash,我們的系統驅動,我們的外設驅動統一都被加載起來,並且根據我們Uboot的配置參數啓動系統
當我們的系統被起來之後,也就是我們的Android被起來之後,要進行一些列的初始化工作
第一個是掛載分區,創建android一系列的目錄
創建目錄後會1加載一些必要的驅動,加載完驅動之後根據我們的啓動腳本去啓動我們的系統服務,比如說mediaService,serviceManger,adbd。。。。。或者說我們自己新加的一些服務都會在這裏啓動。
啓動完之後它還會做一些相關的環境變量的配置,這些配置會在系統中啓用,比如說我們的硬件版本,軟件版本都會在這裏進行設置,最後我們把所有的服務啓動完之後,android啓動服務就會在這裏守護整個系統。
如果說我們有個服務中間出現錯漏,那我們的守護進程就會重新創建這個服務

android啓動時間是比較長的,就這三塊(uboot,kernel,android)根據log週期看一下哪塊比較耗時,根據自己和廠商的支持,針對某一模塊做優化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章