Jollen 的 Android Porting 手札 #1: Android 移植概觀

jollen 發表於 May 10, 2009 9:58 PM

本週六將於北京舉行的「Android 技術大會」上發表有關「Android 移植」的技術演說,配合該演講,最近將陸續整理一些筆記以搭配講稿供與會朋友參考。

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)的移植工作將不再花費工程人員大量的時間,同時就系統層的調校工作來看,也能有更具體明確的調校項目。

移植項目概述

從 Google 發佈的標準 Android 系統架構圖來說,Application framework 以及 application 二層並沒有重要的移植工作需要進行,以下以系統架構的角度來簡介 Android 移植技術的重要事項。

1. Application

應用程式層並移植的工作需要進行,但是因為 Android 每個版本的 API level 都不一樣,因此需要進行 API 相容性的測試。例如,Android 1.1 的 API level 為 2、Android 1.5 的 API level 為 3,需要根據 Google 發佈的 API change 文件進行 application 的相容性測試。

2. Application Framework

以大方向來看,加入新的 library 時需要擴充 application framework;Android framework 以 JNI 呼叫下一層的 library,但是 application 不直接呼叫 library,因此讓 Android framework 的設計更嚴謹。

3. Library

Android 的「external library」裡包含部份現有的 FOSS 專案成果,有些 library 的實作為 machine-dependent,針對 machine-dependent 的實作必須修改其程式碼。例如,android.media.MediaPlayer 的底層為 OpenCore 程式庫,而 OpenCore 的 MP3 decode 部份演算法以 assembly 實作。

4. Dalvik VM

JNI 與 interpreter 是 Android runtimer(Dalvik VM)的移植重點。新版本的 Cupcake(Android 1.5)在 JNI 的部份加入了 x86 的支援,interpreter 目前則是支援 armv4、armv5te 以及 x86。

5. Bionic

Bionic 是 Android 專屬的小型客製化 C library,主要是由 BSD C library 移植而來。支援 Linux kernel 的重要實作,像是:system call、dynamic linker & loader、thread 等等都是檢查的重點。Bionic 裡有一個 libthread_db 是基於 Linux futexes 的 thread 實作,很適合像是手機這樣的小型系統使用。

6. 其它

Android framework 的實作,部份需要考量硬體的規格,例如:Surface Manager 需要考量是否有 GPU 或硬體加速。但你在 Android application 建立一個 Surface holder 時,若是將 Surface 的類型設定為 SURFACE_TYPE_HARDWARE,就必須針對硬體加速與 DMA 做移植工作。

小結

Android 平臺的移植技術仍屬重要,主要的技術能力著重於 Android framework(例如:加入新的 external library)以及 Linux device driver 上。本次 Android 技術大會除了介紹 Android 移植的重點(highlights)以及具體實作方向外,也會展示近期的小小實作成果。

雖然一開始提到,Android 平臺的好處是「將開發者侷限在應用層(application level)」的開發,但是 Android framework 與 Android 移植的能力仍然重要,畢竟這是直接影響產品開發的關鍵力之一。

Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue

您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw