Android本地層基礎結構

1.本地層基礎部分結構

    Android軟件系統中作爲本地基礎部分使用的,主要具有以下部分:

    (1)C語言基礎庫:提供標準C庫功能

    (2)C語言工具庫:Android特定的C語言工具

    (3)init可執行程序:作爲用戶空間的第一個進程

    (4)shell工具:提供用戶調試功能

    其中後三者均在Android源代碼的system/core目錄中,此目錄也就是Android系統中最底層的部分,包括基本的啓動、操作和調試等。


2. C語言基礎:Bionic

    Bionic提供C語言基礎庫的功能,Bionic的源碼和頭文件在bionic/目錄中。

    相對於傳統的C庫實現,Bionic的體積和內存佔用量更小。Bionic支持標準C和C++庫的絕大部分功能,支持數學庫及NPTL線程庫。

    Bionic提供的C++的支持是一種最輕量級的支持,只支持了C++語法,沒有支持STL標準模板庫。

    Bionic使用共享內存的方式來實現。


2.1 Bionic各個部分的結構

    Bionic目錄當中的各個子目錄中的內容如下所示:

    (1)libc:C庫,生成動態庫libc.so和靜態庫libc.a

    (2)libm:數學庫,生成動態庫libm.so和靜態庫libm.a

    (3)libdl:動態庫使用工具,生成動態庫libdl.so

    (4)libstdc++:C++庫,生成動態庫libstdc++.so和靜態庫libstdc++.a

    (5)libthread_db:線程庫,生成動態庫libthread_db.so和靜態庫libthread_db.a


2.2 Bionic的頭文件

    作爲C庫功能的實現,Bionic的頭文件包括幾個部分,C語言標準頭文件、UNIX標準頭文件、Linux內核中的頭文件、Bionic特殊的頭文件。

    (1)主要頭文件

          libc/include目錄中的各個文件爲C語言主要的頭文件,例如stdio.h、stdlib.h等。它們都是C語言標準的頭文件。

          libc/include/sys目錄中的各個文件是Linux系統(以sys爲開頭)的頭文件,例如time.h、ioctl.h等。

    (2)Linux特定的頭文件

          Bionic中的libc/kernel爲Linux內核頭文件目錄。這個目錄是對Linux源代碼中各個部分頭文件的重新組織。

          在Android的本地開發過程中,如果使用<linux/XXX.h>等方式包含頭文件,引用的是這裏的頭文件。

          例如: #include <linux/input.h>     此時實際上引用的是Bionic中libc/kernel/common/linux目錄中的input.h。


2.3 屬性系統的支持

    Android的C庫除了提供標準的功能之外,還提供了Android的屬性系統的底層支持。屬性的本質是一塊共享內存。

    Android中屬性名稱最大32字節,屬性值92字節。


3. C語言底層庫

    在基礎的C庫之上,Android最底層的本地庫是Log庫和C語言工具庫。

    Log庫頭文件:主要爲system/core/include/cutils目錄中的log.h,logd.h等頭文件,另一個相關的頭文件是system/core/include/android目錄中的log.h。

    Log庫文件路徑:system/core/liblog

    Log庫編譯的結果:目標機的動態庫liblog.so和靜態庫liblog.a

    log.h是Log庫的頭文件,其中包含了宏定義,主要包括LOGV、LOGD、LOGI、等宏作爲Log輸出的方法。


4. 設備管理功能

    對於Android系統,需要一個處理設備管理的程序,它的功能類似Linux桌面系統中的udev。它通過監聽Socket獲得內核傳遞上來的信息,然後可以在用戶空間中自動建立或者刪除設備節點(通常是/dev/目錄中的文件)。

    在Android的新版中,使用ueventd程序作爲設備管理的程序,ueventd使用ueventd.rc腳本作爲設備列表。

    ueventd程序將打開ueventd腳本,作爲其中設備管理的列表。與init.rc類似,ueventd實際上也有兩個,一個是名稱爲ueventd.rc的主設備腳本,另一個是名稱爲ueventd.<設備>.rc具體硬件的腳本。二者的功能和語法也是相同的。

    ueventd腳本的默認路徑:system/core/rootdir/ueventd.rc。


5. Shell工具

    Android中的shell功能由sh(shell)和toolbox(工具箱)兩個部分組成,它們是兩個可執行程序,其中sh程序提供的是控制檯,toolbox提供的是各個可執行程序的命令(如ls、mv等)。


6. Android屬性和套接字機制

    Android屬性和套接字機制作爲兩種Android中特殊的程序交互手段。

6.1 屬性機制

    屬性的本質是一塊共享內存,每個屬性使用一個鍵和鍵值的對來表示,二者的格式都是字符串。

    屬性的操作包括讀、寫兩個部分。Android系統各個部分的程序中都提供了接口對屬性進行操作。

    本地程序中,通過libctuils中的properties.h頭文件中定義的property_get()、property_set()和property_list()函數對屬性進行讀取、設置和列出操作。

    在Java程序中,通過android.os包中的SystemProperties類的get()、getXXX()、set()等幾個靜態方法對屬性進行讀取和設置。

    在命令行中,可以通過toolbox的getprop和setprop兩個命令對屬性執行獲得、設置,以及列出所有屬性等操作。


6.2 套接字機制

    Android中用於通信的套接字本質上是基於Linux的套接字。其中較爲特殊的地方是Android保留域名稱的幾個Socket。

    套接字被訪問時,類似於一個文件。因此,相比屬性系統有限的字符信息,套接字在提供交互信息的容量沒有限制。

    Android特定名稱的套接字本質上是文件的套接字,Android在文件系統的固定位置建立節點,賦予其全局的名稱,就可以讓程序的各個部分都通過名字來訪問。

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