1.3 Android簡介

1.3.1 理解Android軟件棧


 
圖1-6 Android SDK軟件棧詳細結構

Android平臺的核心是Linux內核版本2.6.29,它負責設備驅動程序、資源訪問、電源管理和完成其他操作系統的職責。提供的設備驅動程序包括顯示器、照相機、鍵盤、WiFi、閃存、音頻和IPC(Inter-Process Communication,進程間通信)。儘管核心是Linux,但Android設備(比如T-Mobile G1或摩托羅拉Droid)上的絕大部分應用程序都是使用Java開發,通過Dalvik VM運行的。

我們看一下另一層,內核之上是許多C/C++庫,比如OpenGL、WebKit、FreeType、SSL(Secure Sockets Layer,安全套接字層)、libc(C運行時庫)、SQLite和媒體。基於BSD(Berkeley Software Distribution,伯克利軟件套件)的系統C庫針對嵌入式Linux設備進行了調優(大小約爲原始大小的一半)。媒體庫基於PacketVideo(http://www.packetvideo.com/)的OpenCORE。這些庫負責錄製和播放音頻和視頻格式的內容。一個名爲Surface Manager的庫控制對顯示系統的訪問,支持2D和3D。WebKit庫負責瀏覽器支持,WebKit也是Google公司的Chrome和蘋果公司的Safari使用的庫。FreeType庫負責字體支持。SQLite(http://www.sqlite.org/)是一個可在設備自身上使用的關係數據庫。SQLite也是關係數據庫的一項獨立的開源成果,沒有直接綁定到Android。適用於SQLite的工具也可用於Android數據庫。

大多數應用程序框架都通過Dalvik VM訪問這些核心庫,Dalvik VM就像Android平臺的入口。前面幾節已經提到,Dalvik經過了優化,可以運行多個VM實例。訪問這些核心庫時,每個Java應用程序都會獲得自己的VM實例。

Android Java API的主要庫包括電話、資源、位置、UI、ContentProvider(數據)和包管理器(安裝、安全等)。程序員使用此Java API開發最終用戶應用程序。設備上的一些最終用戶應用程序示例包括Home、Contacts、Phone、Browser等。

Android還支持Google公司一個名爲Skia的自定義2D圖形庫,這個庫是使用C和C++編寫的。Skia也是GoogleChrome瀏覽器的核心組件。然而,Android中的3D API基於來自Khronos小組(http://www.khronos.org)的一種OpenGL ES實現。OpenGL ES包含OpenGL中面向嵌入式系統的子集。

從媒體角度講,Android平臺支持最常見的音頻、視頻和圖像格式。從無線角度講,Android擁有支持藍牙、EDGE、3G、WiFi和GSM(Global System for Mobile Communication,全球移動通信系統)電話的API,具體取決於設備硬件。

1.3.2 Android應用程序架構

Activity Manager和Fragment Manager分別控制Activity和Fragment生命週期

View(視圖)用來爲Activity和Fragment創建界面

Notification Manager提供了一種一致的和非打斷的機制來通知用戶

Content Provider 讓應用程序共享數據

Resources Manager 支持像字符串和圖形這樣的非代碼資源的具體化

Intent 提供了一種在應用程序及組件之間傳輸數據的機制

1.3.3 Dalvik VM剖析

作爲Android平臺的一部分,Google公司花了大量時間思考針對低功耗手持設備的優化設計。與桌面設備相比,手持設備在內存和速度方面落後8~10年。它們的計算能力也有限,一個手持設備的總RAM可能只有64 MB,可供應用程序使用的空間可能只有20 MB。

說明 2008年年底發佈的T-Mobile G1電話擁有192 MB RAM、一張1 GB的SD卡和528MHz Qualcomm MSM7201A處理器。摩托羅拉公司2009年年底發佈的Droid擁有256 MB RAM、一張16 GB的microSD卡和550MHz Arm Cortex處理器。而戴爾公司最廉價的筆記本電腦都擁有2.1GHz雙核處理器和4 GB RAM。

因此,手機的性能要求非常高,這需要手機設計人員優化一切要素。如果看一下Android中的包,將會看到它們完善而豐富。據Google公司介紹,即使使用經過優化的JVM,這些系統庫也可能使用10 MB~20 MB RAM。

這些問題使Google公司在許多方面重新審視標準JVM實現。(Dan Bornstein對Google公司的這個JVM實現作出了重要貢獻,他編寫了Dalvik VM,Dalvik是冰島一個小鎮的名稱。)首先,Dalvik VM獲取生成的Java類文件,將它們組合爲一個或多個Dalvik可執行文件(.dex)。它重用多個類文件中的重複信息,與未壓縮的傳統.jar文件相比,有效地將空間需求減少了一半。例如,Android中Web瀏覽器的.dex文件約爲200 K,而對應的未壓縮的.jar版本約爲500 K。鬧鐘應用程序的.dex文件約爲50 K,大約是其.jar版本的一半。

其次,Google公司在Dalvik VM中對垃圾收集進行了調優,但它在早期版本中選擇了刪除即時( Just-In-Time,JIT)編譯器。2.0版的代碼庫似乎擁有JIT編譯器的必要源代碼,但也未在最終版中啓用它。預計在未來的版本中將啓用即時編譯器。該公司支持這一選擇是因爲,Android的許多核心庫,包括圖形庫,都是使用C和C++實現的。例如,Java圖形API實際上是圍繞本地代碼的瘦包裝器類,使用了JNI(Java Native Interface,Java本地接口)。類似地,Android提供了一個優化的C本地庫來訪問SQLite數據庫,但這個庫使用一種更高級的Java API封裝。由於大部分核心代碼都是使用C和C++編寫的,所以Google公司推斷JIT編譯的影響不會很大。

最後,Dalvik VM使用了一種不同的彙編代碼生成方法,它使用寄存器而不是棧作爲主要的數據存儲單元。Google公司希望這樣能將指令減少到30%。應當指出,採用Dalvik VM的一個結果是,Android中最終的可執行程序代碼不是基於Java字節碼,而是基於.dex文件。這意味着無法直接執行Java字節碼,必須首先得到Java類文件,然後將它們轉換爲可鏈接的.dex文件。

這種對性能的狂熱追求還擴展到了Android SDK的其他部分。例如,Android SDK大量使用XML來定義UI佈局。然而,所有XML數據必須編譯爲二進制文件,然後才能將這些文件存儲在設備上。Android提供了一些專門的機制來使用XML數據。


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