【第179期 August 6, 2012】
 

研發新視界

Android系統介紹

作者/吳致翰

[發表日期:2012/7/31]


什麼是 Android ?


Android是一套建構在Linux核心(Linux Kernel)之上的智慧型手機作業系統。使用者可以透過 Android 撥打電話、傳送簡訊、收發電子郵件、查看行事曆、上網、玩遊戲、享受影音娛樂、甚至透過應用程式的下載,達成許多意想不到的創新功能。

由於,Android在軟體版本授權上是採用Apache Software License 2.0的開放原始碼方案,因此,在這個版權協議之下,智慧型手機製造商可免費地安裝Android作業系統至其生產製造的硬體之中,有效地降低了軟體的採購成本。截至2010年8月2日為止,Android在市面上免費流通的軟體版本共有1.5、1.6、2.1與2.2。其中目前以2.1版本的使用量為最多。(資料來源:Android Developers官方網頁)

對於智慧型手機製造商來說,透過免費取得作業系統而降低軟體採購成本是一項很大的誘因,所以,截至目前為止共有Acer(宏碁)、Alcatel、ASUS(華碩)、CCI、Dell、Foxconn(富士康)、Garmin、Haier、HTC(宏達電)、Huawei(華為)、Kyocera、Lenovo、LG、Motorola、NEC、Samsung、Sharp、Sony Ericsson、Toshiba與ZTE等二十家智慧型手機製造商以及其它數十家行動通訊公司、半導體公司、軟體公司以及商業公司陸續加入了開放手機聯盟(Open Handset Alliance)並投入生產、銷售或者研發Android作業系統的相關軟硬體產品與服務。

Android 也因為有如此地百花齊放,因此即使Google的智慧型手機Nexus One有點出師不利,但Android卻能在2010年第二季以市佔率17.2%,擊敗Apple iOS(iPhone的作業系統,市佔率14.2%)奪下全球智慧型手機作業系統的老三地位, 排行僅次於市場龍頭老大Nokia Symbian OS(市佔率41.2%)與RIM BlackBerry OS(市佔率18.2%)。(資料來源:Gartner)

Android 以新秀之姿在短短不到三年的時間就有此成績,不只對於旗下合作的智慧型手機製造商具鼓舞作用,也會促使Android應用程式的開發者,投入更多時間與精力去開發兼具功能性與創新性的應用程式。

再更進一步地說,由於Android在應用程式開發上,採取免費、開放的策略。開發者不僅可以免費地下載安裝Android SDK(Android的軟體開發工具包)進行應用程式的開發。更重要地是,人們可以使用多數程式設計師所熟悉的Java程式語言進行應用程式的編寫。因為這兩個特點,促使為數眾多的Java程式設計師蜂擁至Android應用程式的開發行列。

Android 架構

初期的Android SDK 提供必要的API(應用程式開發介面)與工具以使用Java語言開發在Android平台上開發應用軟體。
主要功能:
    ● 應用程式框架 可以重用或置換元件
    ● Dalvik 虛擬機器 行動裝置最佳化
    ● 整合瀏覽器 基於開放原始碼Webkit引擎
    ● 最佳化圖形 加強自訂2D 圖形;3D 圖形則築基於OpenGL ES 1.0 規格(硬體加速選項)
    ● SQLite 結構化資料儲存
    ● 媒體支援 一般聲音、影片與靜態影像格式(MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF)
    ● GSM 通訊 (硬體相關)
    ● 藍芽、EDGE、3G 與WiFi (硬體相關)
    ● 相機、GPS、電子羅盤(compass)與加速度計(accelerometer) (硬體相關)
    ● 多元的開發環境 包含模擬器、除錯工具、記憶體與效率剖析與Eclipse IDE 的外掛Android架構
    ● Application level :
    最頂端的應用層是使用者唯一會接觸到的階層。應用程式以Java語言寫成。
    Android 附有一系列的核心應用程式,包含郵件程式、簡訊程式、日歷、地圖、瀏覽器、聯絡人與其它應用程式,提供可重覆使用及改寫的元件,透過第二層的應用層框架(Application Framework)往下溝通。
    ● Application Framework:
    開發者可以完整使用與核心應用程式相同的API,應用程式框架為簡化元件重用而設計;應用程式可以發佈功能並為其它應用程式所使用(受限於應用程式框架的安全限制),使用者用同樣的機制用來置換元件。應用程式底層是一組系統與服務。

    《圖一、Android系統架構圖》

    基本上所有的應用程式是由 Services 及 Systems 所組成,包含有:
    1.Views System:用來建構一個應用程式的基本原件,包含了有Lists,Text,Boxes,Buttons..,甚至是一個嵌入式的瀏覽器。
    2.Content Providers(內容提供者):它可以用來讓程式跟程式之間互相存取/分享資料。例如某一個應用程式可以去存取通訊錄應用程式內的聯絡人資料。或者呼用Resource Manager可存取的非程式碼資源,例如:當地性設定(該地貨幣、語言、時間格式)、圖像...等。
    3.Resource Manager(資源管理員):提供各種資源讓程式去使用,比如:區域性的字串,圖片,排版檔(layout files)。
    4.Notification Manager(訊息管理員):提供程式在狀態列(status bar)的地方顯示應用程式自有的警示(alert)訊息。 狀態列設定在手機的頂部,像短訊(short message),voice mail 皆會出現在此。
    5.Activity Manager(活動管理員):管理所有的應用程式生命週期及一般性的navigation backstack。
    6.Window Manager(視窗管理員):管理所有的視窗程式。
    7.Location Manager:應該是用來做地圖服務的功能。
    8.Telephony Manager:管理所有的移動設備(電話)的功能。
    9.Package Manager:Android 系統內所有安裝的程式管理。
    10.XMMP Service:ineXtensible Messaging and Presence Protocol 透過此服務得知手機的位置。

    ●Libraries
    Android 所有豐富多樣的元件皆是由C/C++函式庫所組成,但 Android 所有的應用程式皆必需經由 API 來使用這些功能。 主要的核心函式庫列表如下:

    Android包含一組系統元件使用的C/C++ 函式庫,使用者透過應用程式框架使用這些功能,
    部分核心函式庫列示如下:
    1.系統C 函式庫 : 引用BSD 標準系統C 函式庫(libc),調整為嵌入式Linux 裝置。
    2.媒體函式庫 建立在PacketVideo's OpenCORE 之上;該函式庫支援聲音的播放與錄製、影片格式、與靜態影像格式,包含MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF
    3.Surface Manager 管理顯示次系統存取、與來自多重程式2D 與3D 組合圖層的串流
    4.LibWebCore 現代化的Web 瀏覽器引擎
    5.SGL 2D 圖形底層引擎
    6.3D libraries OpenGL ES 1.0 API 實做;該函式庫使用硬體加速(視硬體提供功能)與3D軟體rasterizer 最佳化
    7.FreeType 圖形與向量字的繪製
    8.SQLite 提供給所有應用程式使用的強大且輕量的關聯式資料庫存取引擎
    9.SSL - Secure Socket Layer專門用於保護網頁通訊的協定。

    ●Android Runtime
    Android 雖然用 Java 程式語言來開發、撰寫應用程式,但卻不使用一般大家目前在用的 Java Runtime(J2ME) 版本來執行 Java 程式,而是用 Android 自有的 Android Runtime 來執行。 Android Runtime 包含下面兩個核心。

    ●Core Libraries
    核心函式庫裡頭已經包含了絕大多數 Java 程式語言所需要呼用的功效函式,接著每一個Android 應用程式都會以自屬的 process ,而且 Android 不是用一個 Dalvik 虛擬機器來同時執行多個 Android 應用程式,而是每個 Android 應用程式都用一個自屬的 Dalvik 虛擬機器來執行。

    ●Dalvik Virtual Machine
    Dalvik 虛擬機器是一種暫存器型態的虛擬機器。在撰寫開發時就已經設想用最少的記憶體資源來執行,以及前述的「同時可執行多個 VM 個體」。

    Dalvik 虛擬機器有許多地方是參考 Java 虛擬機器設計,Dalvik 虛擬機器所執行的中介碼並非是Java 虛擬機器所執行的 Java Bytecode,同時也不直接執行 Java 的類別檔 ( Java Class File ),而是依靠轉換工具將 Java bytecode 轉為 Dalvik VM 執行時特有的 dex(Dalvik EXcutable) 格式,稱為.dex。Dalvik VM 相較於 Java VM 最大的不同在於 Java VM 為 Stack-based,而 Dalvik 是Register-based。

    以技術層面考量 Register-based VM 的特性有個很大的好處,那就是對於現有主流的硬體架構,如此很容易與現有系統整合且最好化,而所需要的資源也相對較少。 甚至在硬體實作 VM 上會比較容易實現。 最重要的是 Dalvik 並非是 Java ME 的實作,因此沒有 Java ME 授權相關的議題。

    Android 平台的作業系統用的是Linux,其核心版本為2.6版,Android 所用的Linux核心,其包含的功效包括:安全(Security)、記憶體管理 (Memory Management)、行程管理(Process Management)、網路堆疊(Network Stack,大陸方面稱為:網絡堆棧)、驅動程式模型(Driver Model)等,另外也在前述的軟體堆疊與硬體間建立起一個抽象層(Abstraction Layer)。

    ●作業系統層(Linux Kernel)
    Android平台的作業系統用的是Linux,其核心版本為2.6版,Android所用的Linux核心,其包含的功效包括:安全(Security)、記憶體管理(Memory Management)、行程管理(Process Management)、網路堆疊(Network Stack,大陸方面稱為:網絡堆棧)、驅動程式模型(Driver Model)等,另外也在前述的軟體堆疊與硬體間建立起一個抽象層(Abstraction Layer)。


Android Process Lifecycle(行程生命週期)

除了Activity Lifecycle之外,Android還有一段Process Lifecycle的說明如下:

《圖二、Process Lifecycle說明》

上圖裏有三個主要迴路
1.entire lifetime:
一個Activity的entire lifetime是由onCreate(Bundle)開始,一直到onDestroy()結束。一個Activity可以把所有的資源設定寫在onCreate裏,一直到onDestroy()時,再釋放出來。比如說,你需要一個執行緒在背景執行網路下載資料,這個thread就可以在onCreate()裏建立起來,一直到onDestroy()再把thread釋放不要用。

2.visible lifetime:
一個Activity的visible lifetime則是指在onStart()到onStop()之間,算是"可視生命時期",在這段時間內,使用者可以在螢幕上看見Activity,要注意這個"看見"算是抽象形容詞@@這個Activity不見得一定在前景直接跟使用者可直接互動。比如說:你可以在onStart()註冊一個BroadcastReceiver用來監控並改變你的UI,當使用者不想再看你所呈現的結果時,在onStop()移除註冊的BroadcastReceiver。onStart()跟onStop()可以在activity在visible及hidden兩個狀態切換時多次被呼叫執行。

3.foreground lifetime:
一個foreground lifetime則是指onResume()到onPause()之間,在這個時期的Activity是在所有的Activity的前面,並且直接跟使用者進行互動,所以這段時期指的就是圖裏的Activity is running囉。 一個Activity能很頻繁的在resume及pause這兩個狀態切換,比如:當一個裝置進行睡眠時,當一個Activity的結果被傳送,當一個新的intent被傳送時。所以在onResume()及onPause()裏實作的程式應盡量精簡。

看到這裏先做個小結:onCreate()用來做程式的初使化動作,onDestory()通常都拿來把onCreate()時所要來的資料做釋放的動作,onPause()時把需要保存的資料在此時保存,onResume()把保存的資料拿回來使用。

Android系統基本上都會盡量的維持應用程式的運作,但如果記憶體真的不夠用時,就會需要把舊的或不需要用的應用程式移除。 就如同之前的Activity生命週期所介紹,這個移除的決定是由應用程式所處的狀態來判斷。一般來說,一個應用程式有四個狀態,底下由最重要到不重要的順序列出這四個狀態。 當需要移除應用程式時系統將會自已做排序,然後從最不重要的開始移除。

Foreground Activity(這個activity就是在螢幕最頂端,是目前跟使用者保持互動)所以它的優先權最高,原則上會是一個最後被移除的程式,除非,這個Activity所需要的記憶體大小已經超出系統所能給與的了。
Visible Activity(這個activity是可以被使用者看見,但並不是最頂端的一個程式,比如說:最頂端的程式並不是全螢幕的,或者是有個對話盒跳出來時),所以它的權重也很高,非到必要的情況,也不會去移除這種activity。

Background Activity(這個activity是無法被使用者看到的的情況,並且已處於pause的狀態)這種情況下的應用程式就沒上面兩種情況處於那麼重要的位置,所以當系統需要把更多的記憶體空間分配給foreground或visible process時,系統就可以考慮把background activity給安全的移除掉。如果說這個background activity就移除了,使用者又操作了返回這個已被移除的activity時,這個activity就會把savedInstanceState並執行onCreate(Bundle),savedInstanceState是來自於當activity被移除時所會執行的onSaveInstanceState(Bundle)所儲存起來的。

Empty Process這個所謂的空行程指的是那些沒有跟Activity綁定在一起的行程,也沒有跟任何的應用程式元件(比如Service或BroadcastReceiver)綁定在一起,這些空行程一定是最最最快被系統優先考慮移除的,所以如果你真的必需要用到Service/BroadcastReceiver這些功能時,你一定要把他們給你的activity綁在一起,否則系統會認為它不重要而去移除它。

有時候有些Activity可能會需要執行較長時間的操作,而且希望這個操作可以是一個較特別的activity生命週期。比如說一個攝影機的應用程式,它允許使用者上傳相片到網站去,這個上傳的時間可能需要蠻長的,這種情況下這個應用程式應要可以讓使用者離開這個應用程式,但上傳程式還必需繼續運作,要實現這種功能,你的應用程式就必需啟動一個Service用它來負責上傳的功能。 在這種情況下呢,你可以把這個上傳功能的service看成是比non-visible activity再重要一點的地位。

Android 的技術優點

Android 平臺的好處是「將開發者侷限在應用層(application level)」的開發,並透過一個設計良好的 application framework 將 library 層「包裝起來」。傳統 GNU/Linux 系統的「開源模式」是「從裡到外」全面開放,應用程式來自四面八方,每個應用程式底層使用到的 library 並不相同,這讓 Linux 平臺的軟體發展容易失控,造成 Linux distribution 上雖然收錄了豐富的應用程式,但相對的也要包山包海地納入非常多的 shared library。

Android 雖然也採用了其他 open source 的專案成果,但 Android 以很聰明的方式,解決傳統 Linux 開放手機平臺的「相依性」問題,這也是過去長久以來,匯整使用(leverage)開放源碼專案開發產品的大問題。Application framework 採用 Java 程式語言,並軟性的將開發者限制在 application level 是 Android 解決上述技術難題的一個關鍵。
網路上有著數以萬計的 Free & Open Source Software 專案,而被 Android 採納的 FOSS 專案僅有約 60 個左右,比起傳統 Linux distribution 必須收錄上千個套件的數量來看,Android 未來若能發揚光大,能是扮演「收斂」開源軟體發展模式的推手。

傳統的 Embedded Linux 系統程式基於 GNU libc 以及大量的相依程式庫(library dependencies),因此很容易有「牽一髮而動全身」的問題出現。例如:某一個library的API變動(可能是函數改名或移除)將使得其它程式庫與應用程式執行錯誤,這時就必須修改原始程式碼並重新編譯才能解決問題。
這個問題的主因,是因為 Linux 系統是採取動態程式庫(shared libraries)的機制,程式庫的變更雖然只需要「抽換」掉動態程式庫檔,但是應用程式在執行時,才會產生「無法載入符號」的錯誤,除非是「定期」進行「系統重編譯」,否則很難即時修正此錯誤。

Android 的底層並無太複雜的「程式庫相依」問題,這使得 Android 可以比較容易將系統與 IDE 開發工具做整合。在標準 C 程式庫(C library)方面,Google 則是採用 BSD 授權實作了一份適合手機系統使用的版本,無疑是一個值得稱許的做法。

由上述的分析來看,Android 平臺在系統層(library、kernel)的移植工作將不再花費工程人員大量的時間,同時就系統層的調校工作來看,也能有更具體明確的調校項目。

參考資料來源

http://code.google.com/android
http://stenlyho.blogspot.tw/search/label/Android
http://blog.chinatimes.com/tomsun/archive/2007/11/03/213763.html
http://web20.ncyu.edu.tw/sheng/download.php?id=113