Android開發入門之三--Android Overview

【內容導航】
Android Overview
Android的學習內容和方法

1 Android Overview

Android就是架構在Linux Kernel上一套GUI系統,而Android中間層的完備強大遠遠強於傳統GUI系統,比如MiniGui,QtEmbedded之類。當然其最最精華之處是引進了虛擬機,讓廣大的JAVA開發人員非常容易轉到Android應用開發上,幫助其打造一個強悍的應用商店。這個應用商店就是粘住用戶最最關鍵的東西。Android Market和App Store之間的競爭,是Android陣營和Iphone的競爭中最重要的部分。

首先來看Android Architeture:
AndroidOverview0

從上至下分爲5部分:Applications,Application Framework,Android Runtime,Linux Kernel,其中藍色部分使用JAVA語言,黃色部分爲Dalvik虛擬機,綠色部分用C++和C,紅色部分用C和彙編。

以下內容將對android的架構圖從上至下(從APP至Linux kernel)做一個描述,每描述完一部分就在框圖上補上一部分內容,這樣當我們把這張圖補全時,就能完全瞭解了Android包含的內容,從事Android開發需要需要關注的領域。

1.1 Applications

AndroidOverview1
常用的Application如上圖所示,即基於Applicaiton Framework提供的API,開發出來的Android應用。絕大部分Android開發人員,都屬於這一層。Application的開發基本都是脫離源碼,使用Android SDK提供的標準API進行的,當然擁有自己硬件平臺的手機/平板 OEM,可以修改源碼擴展API,基於擴展API開發出來的應用只能在自己的平臺上運行。

1.2 Application Framework

AndroidOverview2  
Application Framework向上對Application提供API,向下對系統提供的功能進行抽象封裝。暴露給應用的Manager通常代碼比較少,真正的工作通過bind service,讓service來做,所以Manager作爲提供API的部分,代碼是比較乾淨清爽的。如Activity Manager的框架如下圖所示:
AndroidOverview3
這種圖中,綠色的部分是在SDK中開放給應用程序開發人員的接口,紅色的部分是底層的服務實現,是真正的動作執行者,作爲Client的Manager,和作爲server的Service,是通過藍色的部分Proxy模式聯繫起來的。Proxy Ibinder實現了Manager和Service之間的鬆耦合。

Applicaiton Framework的常見模塊簡介如下:
(1) Views System:用來建構一個應用程序的基本原件,包含了有lists,grids,text boxes,buttons,等等widget
(2) Content Providers:它可以用來讓程序跟程序之間互相存取/分享數據。
(3) Resource Manager:提供各種資源讓程序去使用,比如:區域性的字符串,圖片,排版文件(layout files)。
(4) Notification Manager:提供程序在狀態欄(status bar)的地方顯示應用程序自有的警示(alert)訊息。 狀態欄Android設定在手機的頂部,像短訊(short message),voice mail皆會出現在此。
(5) Activity Manager:管理所有運行着的Activity,與系統中所有運行着的Activity交互提供了接口,主要的接口圍繞着運行中的進程信息,任務信息,服務信息等。
(6) Window Manager:管理所有的窗口程序。
(7) Location Manager:應該是用來做地圖服務的功能。
(8) Telephony Manager:用來管理所有的移動設備(電話)的功能。
(9) Package Manager:Android系統內所有安裝的程序管理。

1.3 Android Runtime
AndroidOverview4                                                            

Android Runtime包含如下2部分:

Core Libraries:JAVA核心庫,包含了JAVA最基本的類庫,比如File Access,Network Access,Graphics,String類等等。這就如同C語言的glibc一樣,Android開發人員完全不需要關注修改這部分。

Dalvik Virtual Machine:按照Google的說法,Dalvik有如下優點:
(1)Provides application portability and runtime consistency
(2)Runs optimized file format(.dex) and Dalvik bytecode
(3)Java .clss/.jar files converted to .dex at build time
(4)Supports multiple virtual machine processes per device
(5)Highly CPU-optimized bytecode interpreter
(6)Uses runtime memory very efficiency

除Google的開發人員,其餘Android開發者基本不需要關注Android Runtime的內容。

1.4 Native Libraries

AndroidOverview5

運行在虛擬機上的Application Framework的JAVA類想要使用Native Library中用C++實現的Native方法,必須通過JNI。Native Libraries太多太龐大,通常不可能每個模塊都能瞭解清楚,從事android中間層開發的人,通常是對其中的某些模塊比較熟悉和精通。一些常見和重要模塊如下:
1 Bionic Libc:Android用戶空間使用的C庫,使用Bionic Libc的原因:在空間和速度上針對嵌入式設備做了優化;使用Glibc會受到GPL的束縛。因爲使用了Bionic libc,Android使用的工具鏈和標準的gcc是有差別的。
2 Webkit:瀏覽器引擎,來自開源:http://webkit.org
3 Media Framework:多媒體框架,Android 2.3以前使用Opencore,從2.3開始使用Stagefright。
4 SQLite:經典的輕量級數據庫
5 OpenGL ES:3D圖形處理
6 Surface Flinger:Android的架構設計中,將圖像和音頻的輸出,都與圖像和音頻數據的生產者獨立開來的。Surface Flinger就是用來處理輸出圖像的疊加,然後將疊加好的數據送到Framebuffer。如下圖:
AndroidOverview6
Surface Flinger可以使用OpenGL ES和 2D的硬件加速器進行圖像合成 
7 Audio Flinger:類似於Surface Flinger,對音頻生產者產出的PCM數據進行合成,然後輸出,如圖:
AndroidOverview7 
8 Hardware Abstraction Layer:硬件抽象層,處於User Space,定義好Android要求硬件驅動實現的接口,將平臺和driver隔離開。HAL產生的最大原因是:如果將硬件驅動代碼完全放在Linux Kernel下,就需要遵循GPL,OEM如三星/摩托/HTC需要開放驅動源碼,那就暴露了使用的硬件型號。而HAL將驅動的邏輯代碼全部放到了Android User Space,Linux Kernel僅僅保留寄存器操作部分,放在Android User Space的驅動邏輯代碼就可以不公開了。

1.5 Linux Kernel

AndroidOverview0

Android使用的Linux Kernel僅僅是使用Linux的內核部分,不包含任何圖形系統。並作了以下修改:Alarm,Low Memory Killer,Ashmem,Kernel Debugger,Binder,Logger,PowerManagement。而我們接觸最多就是Binder和Power Management了。
Binder:用於處理進程間通信,而應用空間經常見到的情形是Manager用Binder bind上Remote Service,使用其提供的服務,如下圖:
AndroidOverview8
Power Management:Andriod的電源管理最大的特點是使用更加Aggressive的策略,如果模塊不想被睡眠,必須主動申請“wake locks”。

1.6 實例

至此,Android的整個架構從上倒下已經描述了一遍,現在通過一個實例來使我們對Android的整個架構有個更具體直觀的認識。
AndroidOverview9 

這幅圖在Froyo(Android2.2)上對應的源碼路徑如下:
Applications:MediaPlayerDemo.java (development/samples/apidemos/src/com/example/android/apis/media)
Application Framework:MediaPlayer.java (frameworks/base/media/java/android/media) 
JNI:android_media_MediaPlayer.cpp (frameworks/base/media/jni) 
Libraries:Mediaplayer.cpp (frameworks/base/media/libmedia) ;AudioFlinger.cpp (frameworks/base/libs/audioflinger)

2 Android的學習內容和學習方法

可以將Android的整個架構概括分成Android用戶空間和Linux內核空間,這2部分相對獨立,大部分從事Android開發的人員就只涉獵其中一個領域。而用戶空間的開發又可分爲應用開發和中間層開發,但有不少擁有自己硬件平臺的研發人員應用和中間層都會涉及到。

所以Android的學習也可分成Android用戶空間開發和Linux開發2部分。其中Android的學習內容和方法推薦如下:
1 Android應用開發:不涉及Android源碼,使用Android SDK+eclipse+ADT+模擬器進行開發,最大的開發人羣從事這一層,可以是個人也可以是公司,因爲不需要依賴具體的硬件平臺,只依賴於Android SDK提供的API。學習這部分最好的資料是SDK文檔+API Demo。最最基礎的部分的學習順序可以爲:
Android Overview-->Android4大組件-->eclipse及DDMS的使用和debug-->工程文件簡介-->佈局和常用控件比如Listview—>Looper Handler
學習的過程中最好自己去寫一些小練習,不懂的地方再回去查閱SDK文檔。這部分掌握後可以再去學學數據存儲,多媒體,地圖之類。總之,這部分還是很容易入手的。

2 中間層開發:不需要關注Android Runtime,需要關注的是Application Framework+Native Libraries。推薦掌握的部分有:
(1) Layer Interaction:APP一直到Kernel的調用路徑
(2) 開機啓動:看完這個對系統會更加了解。
(3) Ibinder
(4) 音頻系統Audio Flinger和圖形系統Surface Flinger
(5) 自己從事的模塊:因爲內容太多,前面的掌握後,關注自己從事的模塊就可以了,學不完的。

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