天天看點

《Android Studio應用開發實戰詳解》——第1章,第1.4節Android和Linux的關系

本節書摘來自異步社群《android studio應用開發實戰詳解》一書中的第1章,第1.4節android和linux的關系,作者 王翠萍,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

1.4 android和linux的關系

在了解linux和android的關系之前,首先需要明确如下3點。

(1)android采用linux作為核心。

(2)android對linux核心做了修改,以适應其在移動裝置上的應用。

(3)andorid開始是作為linux的一個分支,後來由于無法并入linux的主開發樹,曾經被linux核心組從開發樹中删除。2012年5月18日,linux kernel 3.3釋出後來又被加入。

1.4.1 android繼承于linux

android是在linux的核心基礎之上運作的,提供的核心系統服務包括安全、記憶體管理、程序管理、網絡組和驅動模型等内容,核心部分還相當于一個介于硬體層和系統中其他軟體組之間的一個抽象層次,但是嚴格來說它不算是linux作業系統。

因為android核心是由标準的linux核心修改而來的,是以繼承了linux核心的諸多優點,保留了linux核心的主題架構。同時android按照移動裝置的需求,在檔案系統、記憶體管理、程序間通信機制和電源管理方面進行了修改,添加了相關的驅動程式和必要的新功能。但是和其他精簡的linux系統相比(例如uclinux),android基本上保留了linux的基本架構,是以android的應用性和擴充性更強。目前android的版本和linux核心的版本沒有直接對應關系,也就是說所有版本的android系統都可以運作在linux 2.6以上核心中。其實android不是一個完整的os(系統),這也是android一直說自己是平台的原因。android中的linux核心負責系統底層的排程工作,對于一般使用者而言,核心可以近似看成windows下的“驅動”。

1.4.2 android和linux核心的差別

android系統的系統層面的底層是linux,中間加上了一個叫作dalvik的java虛拟機,表面層上面是android運作庫。每個android應用都運作在自己的程序上,享有dalvik虛拟機為它配置設定的專有執行個體。為了支援多個虛拟機在同一個裝置上高效運作,dalvik被改寫過。

dalvik虛拟機執行的是dalvik格式的可執行檔案(.dex)——該格式經過優化,以降低記憶體耗用到最低。java編譯器将java源檔案轉為class檔案,class檔案又被内置的dx工具轉化為dex格式檔案,這種檔案在dalvik虛拟機上注冊并運作。

android系統的應用軟體都是運作在dalvik之上的java軟體,而dalvik是運作在linux中的,在一些底層功能——如線程和低記憶體管理方面,dalvik虛拟機是依賴linux核心的。由此可見,可以說android是運作在linux之上的作業系統,但是它本身不能算是linux的某個版本。

android核心和linux核心的差别主要展現在11個方面,接下來将一一簡要介紹。

1.android binder

android binder是基于openbinder架構的一個驅動,用于提供android平台的程序間通信(inter-process communication,ipc)。原來的linux系統上層應用的程序間通信主要是d-bus(desktop bus),采用消息總線的方式來進行ipc。

2.android電源管理(pm)

android電源管理是一個基于标準linux電源管理系統的輕量級的android電源管理驅動,針對嵌入式裝置做了很多優化。利用鎖和定時器來切換系統狀态,控制裝置在不同狀态下的功耗,以達到節能的目的。

3.低記憶體管理器(low memory killer)

android中的低記憶體管理器和linux标準的oom(out of memory)相比,其機制更加靈活,它可以根據需要殺死程序來釋放需要的記憶體。low memory killer的代碼很簡單,關鍵的一個函數是lowmem_shrinker。作為一個子產品在初始化時調用register_shrinke注冊了個lowmem_shrinker,它會被虛拟機在記憶體緊張的情況下調用。lowmem_shrinker完成具體操作。簡單來說,就是尋找一個最合适的程序殺死,進而釋放它占用的記憶體。

4.匿名共享記憶體(ashmem)

匿名共享記憶體為程序間提供大塊共享記憶體,同時為核心提供回收和管理這個記憶體的機制。如果一個程式嘗試通路kernel釋放的一個共享記憶體塊,它将會收到一個錯誤提示,然後重新配置設定記憶體并重載資料。

5.android pmem(physical)

pmem用于向使用者空間提供連續的實體記憶體區域,dsp和某些裝置隻能工作在連續的實體記憶體上。驅動中提供了mmap、open、release和ioctl等接口。

6.android logger

android logger是一個輕量級的日志裝置,用于抓取android系統的各種日志,是linux所沒有的。

7.android alarm

android alarm提供了一個定時器,用于把裝置從睡眠狀态喚醒,同時它也提供了一個即使在裝置睡眠時也會運作的時鐘基準。

8.usb gadget驅動

usb gadget驅動是一個基于标準linux usb gadget驅動架構的裝置驅動,android的usb驅動是基于gadget架構的。

9.android ram console

為了提供調試功能,android允許将調試日志資訊寫入一個被稱為ram console的裝置裡,它是一個基于ram的buffer。

10.android timed device

android timed device提供了對裝置進行定時控制的功能,目前僅僅支援vibrator和led裝置。

11.yaffs2檔案系統

在android系統中,采用yaffs2作為mtd nand flash檔案系統。yaffs2是一個快速穩定的應用于nand和nor flash的跨平台的嵌入式裝置檔案系統,同其他flash檔案系統相比,yaffs2使用更小的記憶體來儲存它的運作狀态,是以它占用記憶體小;yaffs2的垃圾回收非常簡單而且快速,是以能達到更好的性能;yaffs2在大容量的nand flash上性能表現尤為明顯,非常适合大容量的flash存儲。