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 的設計。
Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue
您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw