無線行動軟體技術

回應

1. Android是Google的手機作業系統和相關軟體的總稱,和一般在說「Symbian」、「Windows Mobile」時是相同的。 備註:依當時我去參加Android Platform論壇,其中說到,Android嚴格來說只算是Application,而其OS為Linux,Android只是架構在Linux之上!
2. Android有兩個不同,但相關的組成元件:以 Linux 為核心的 Android 行動平台(這間公司是 Google 在 2005 年買下的)和 Open Handset Alliance,一個由 33 間手機製造商、軟體商和電信業者組成的 Android 推廣聯合會。
3. 並沒有所謂的硬體「Gphone」,而 Google 也沒有打算(或至少沒有公開打算)要進入手機硬體市場。到時候真的做手機的,是 HTC、Samsung、LG 這些手機廠,而因為 Android 的程式碼是開放式的,理論上任何人都可以以 Android 為基礎開發新手機。
4. 雖然平台是開放的,但並沒有辦法保證裝到手機上了之後還是開放的。手機商和電信業者有權利決定是否在特定的機種上允許第三方軟體的安裝。
5. Nokia、Apple、Palm 和 Microsoft 不在這個 33 間公司的名單中。Palm 稍早發佈了新聞稿表示將繼續在 Palm OS 平台上支援 Google 的服務。
6. 第一批 Android 手機預計在 2008 年下半年上市。傳聞中 Google 有用一台 HTC 的概念機「Dream」來示範 Android 平台,而這隻概念機有可能成為第一批使用 Android 的手機之一。

系統架構

    Android 採用了 Linux kernel,所以當然得照遊戲規矩來。但我們從前文可知,Android 的重點就是商業應用,他們可不願意系統裡有什麼「灰色地帶」,於是採用了一些手法來繞過這問題。他們把驅動程式移到 “userspace”,也就是說,把驅動程式變成在 Linux kernel 上頭跑,而不是一起跑的東西,這樣就可以避過GPL。然後,在 kernel 這邊開個小門,讓本來不能直接控制到硬體的 “userspace” 程式也可以碰得到,這樣只要把「開個小門」的程式碼公佈就行啦。事實上,目前因為 Android 已經發行,所以依法他們已經公開了對 kernel 的修改,其原始碼在 http://git.android.com/
    至此,我們可以看出 Google 的原則之一“Do no evil”是很有意思的。他們自己的確承諾,而且也願意公開 Android 的程式碼,但是他們給了其他人 “Do evil” 的選擇。這樣還算不算是 Do no evil 呢?當作哲學問題吧。
關於 Android 對 kernel 的修改,Google 的簡報還提供了兩個重點:
1. Binder (IPC):提供有效率的程式間溝通管道(Inter-Process Communication)。Android 系統中有很多服務,而上層的應用程式經常要取用這些服務,一般的 Linux 系統已經提供了不少 IPC 的方式,不過 Android 還是搞了套自己的。雖說文件中解釋原因為「一般 IPC 會造成額外資源花費,以及安全問題」,但其實這些都是可以基於原有架構在 kernel 外頭解決的,為何要改在 kernel 裡頭,筆者對此存疑,也只能等找時間去研究程式碼才知了。
2. Power Management:與桌上型電腦或筆記型電腦不同,手持裝置的電源一向相當有限,必須無所不用其極的去想辦法省電,但又不損及順暢的使用經驗。Android 在此採取了頗為積極的作法:「沒有人說要用,就關掉」。例如某程式在放 MP3 音樂,於是此程式會需要 CPU 的計算能力,那就得開口要。如果與此同時沒其他程式在執行,那麼 LCD 顯示器就可能被關掉,藉以省電。另一特別處,是在於 Linux kernel 一般考慮的都是在電腦上的作法,所以多半只有進入暫停、休眠等等的選擇,而不會如此細緻的去控制到各個小裝置的電源供應。 

系統函式庫

這裡說的系統函式庫是指 “native libraries”,是跑在系統裡頭的函式庫,採用的語言不是 Java,提供一些基礎建設。裡頭有幾個值得一提的元件:

  1. Bionic:這是 Android 版的 libc。libc 是 GNU/Linux 以及其他類似 Unix 系統上最基礎的函式庫,一般最常用的是 glibc,就是 GNU 做的 libc。不然在比較小型的裝置上也可以用 uclibc。不論是 glibc or uclibc,版權都是LGPL (GPL 的略為弱化版)。看到這大概可以猜到了吧,又是 Copyleft 問題。官方的說法是,除了版權問題以外,還考慮必須輕量以及快速,所以才做了自己的 libc。不過輕量、快速,本來就是小型裝置用的 uclibc 一開始的目標,因此,最主要的恐怕還是版權問題。
  2. Webkit:鼎鼎大名的 Apple Safari 瀏覽器背後的引擎就是 Webkit,Android 也包含進去了。離線使用的 html 配上 html 5 的一些新發展,產生了各種有趣的可能,這部分值得另文介紹,這裡就不再贅述。
  3. Surface Flinger:提供把各種”surface”組合在一起的能力。在這裡 surface 解釋為程式想要顯示在螢幕的東西,可能同一螢幕上有來自不同程式的內容,而這些內容有可能是 2D 顯示或是 3D 顯示等等之類。Surface flinger 就是把這些東西結合起來,一起送到螢幕上。目前程式碼還沒公布,不過 2D 跟 3D 的混合顯示一直都是問題,根本原因是我們通常告訴 3D 顯示卡的東西都是一些「我要在哪裡哪裡畫上什麼形狀,貼上某某材質然後旋轉多少度」之類的事情,也就是說,我們並不知道最後顯示出來會長什麼樣子,那是顯示卡上頭的 GPU 去算出來的。一般這些東西是顯示在一個有裝飾的視窗裡頭,這裝飾通常是 2D 效果。接下來假定我們想要旋轉這整個視窗,而且裡頭的東西還要繼續動,那等於要隨時把握 3D 視窗裡的東西長什麼樣子,然後把它跟 2D 的視窗框框結合,然後再開始轉動。目前在一般 GNU/Linux 上這件事情還沒有處理的非常好,Android 怎麼做,值得在程式碼公布之後注意。
  4. 硬體抽象層 (Hardware Abstraction Libraries):這就是前文所述的 userspace 驅動程式,如果想要將 Android 在某硬體平台上執行,基本上完成這些驅動程式就行了。其內定義了 Android 對各硬體裝置例如顯示晶片、聲音、數位相機、GPS、GSM 等等的需求。