Android 瀏覽器與 Webkit 專案心得:AOSP 心酸說不完

jollen 發表於 December 23, 2011 3:44 PM

2011歲末時刻,要好好為自已上一堂「Lessons Learned」課程。

今年度有幾個 Android 專案,特別令人印象深刻,其中一個是有關於 Android 瀏覽器與 webkit 的計畫。因為開發專案的需要,修改了 Android 瀏覽器 (Browser) 的程式碼,也對 Webkit 做了些研究,沒想到這整個過程,倒是有點出乎我的意料之外;原本以為這是一個簡單,且能輕易結案的計畫,沒想到踩到 AOSP 的地雷。在這個瀏覽器開發專案接近尾聲時,在這裡分享一點甘苦談。

Google 採用 Webkit 做為 Android 內建瀏覽器的 HTML 引擎,Webkit 是相當知名的 HTML 引擎,由 Apple 公司做了早期的開發,現在則是成為了一個開源計畫,由社群開發者,以及部份公司,共同貢獻程式碼。

這個開發專案需要基於現有的 Android 2.2/2.3 瀏覽器,加入一些功能,並能整合伺服器端的服務,其中一個功能,需要使用到瀏覽器的 Copy/Selection 功能。就如同大家所知道的,Android 2.2 的 WebView 並沒有 Selection API,Android 2.3 在 WebView 加入了 Selection API,「但是卻沒有完整且良好的實作」。

原本天真的以為,「把沒有實作完成的 API 做完」,就可以交卷了,沒想到後續發展,根本沒有辦法寫劇本,到後期則是在兵恾馬亂的情況下,「補洞」加「救火隊」的方式搞定專案。這一切都要從 Android 的設計與實作講起。

部份的 API 設計過於鬆散,有些程式碼的實作也還是 prototype 階段;這就是開發 AOSP 的惡夢,工程師要面對鬆散的設計,以及不完整的實作,到最後只能拋開一切理想化的做法,開始進行捕洞與救火工程,然後希望下一個洞不要出現,眼不見為淨,希望專案早早收尾。

由於廠商需要同時推出 Android 2.2 與 2.3 的平板電腦,所以需要同時開發 2.2 與 2.3 的瀏覽器。但是,二個版本的瀏覽器程式碼有一些差距,為了簡化開發工作,並且讓程式碼更一致性,首先我做了一個工作,就是將 Android 2.3 的瀏覽器 Backport 至 Android 2.2。

這期間遇到一些小問題,例如:Android 2.2 並沒有 EdgeGlow 的功能。為了讓 Android 2.3 的瀏覽器可以在 2.2 上正常執行,也修改了 WebView 以及一小部份的 native webkit。Android 2.3 雖然支援了 selection API,但是並沒有實作「彈出視窗」的功能,在這個部份花了一點時間實作,因為希望儘量不去破壞 WebView 的 behavior,所以對 WebView 做了一次完整的研究。專案開始的初期,花費許多時間在了解 WebView 的設計。

讀者留言 (3)

  • Fred 於 December 23, 2011 18:59:

    只有『~!@#$%^&*()_』可以表達我的心聲。

  • jollen 於 December 23, 2011 23:07:

    救火隊隊長要來發表心酸嗎 ;-)

  • 匿名 於 December 28, 2011 16:26:

    救火員 ooxx 報到!!

    我這陣子也在和 WebKit 混戰 - 客戶的網頁在 android 2.2 上用 D_PAD key 移動 Javascript 產生的按鈕反應遲鈍,目前還在救火中。

    不知道組個軟體救火俱樂部會不會很麻煩??

留言功能維護中。將於近日重新開放。

連絡作者

Jollen Chen,Moko365(仕橙3G教室)講師,熱愛研究 Linux 與 Android 技術。曾為 Motorola、HTC、Foxconn、LG、OPPO、騰迅、廣達電腦、緯創、仁寶等超過 50 家企業講授課程。目前在 MokoVersity 擔任軟體工程師,撰寫 Node.js 程式,也在幾家科技廠兼任 Android Framework 研發顧問。您可透過電子郵件 <jollen (at) jollen (dot) org> 或這裡與我連絡。