Opensignal 早前一編關於 Android 碎片化的報導得到各大手機資訊網站轉載,但經過各編輯消化後報導都變得比較負面,指出碎片化問題會影響開發者意欲。其實原文取態中性,將各設備以視覺化顯示,並指出碎片化的好壞與應對。Android 的碎片化是否真為開發者帶來很大的問題?筆者可以講講 Android 向後支援的歷史。 一直以來 Google 發表了不少新的 UI 功能以加強用戶體驗,計有 Honeycomb(Android 3.0)發表的 Action Bar、Fragment、Property Animation。Honeycomb 發表並於 Ice Cream Sandwich(Android 4.0)大幅進化的 Holo Theme、Grid Layout,Jelly Bean(Android 4.1)發表的新版 Notification,豐富 Activity 轉換動畫的 ActivityOptions 等。大量新功能要向下支援舊版本確實是開發者一大煩惱。 其實早於 2011 年 Honeycomb 推出時, Google 就有幫助開發者解決向後兼容問題。主要原因是 Honeycomb 是為平板電腦而生的版本,它其中一個重要更新就是加入了 Fragment 這個可支援多視窗顯示的功能。Fragment 出現之前,軟件都是以 Activity 一版版的頁面向用家呈現,Fragment 的存在使得大螢幕的平板電腦視窗布局增加更多可能,而 Fragment 的應用更可推至手機甚至不同尺寸的螢幕,使開發者可以更簡單地對不同尺寸之設備作出調整。下圖可以看到,Fragment A 及 B 如何在不同尺寸的設備顯示兩個不同視窗。 當然這個重要更新在 Honeycomb 前是不存在的,而當時主要流通的版本為 Android 2.2 Froyo 及 Android 2.3 Gingerbread。為了要同時支援各個版本,Google 於 Honeycomb 發布後就推出了 Support Library。第一個版本的 Support Library 向後支援了 Fragment 到各個系統,同時鼓勵開發者將所有視窗都轉由 Activity 轉為 Fragment,使每一個畫面都能夠簡單地從新布局。當年 Google 於各大城市都有舉辦 developer lab 為開發者解釋 Fragment 之應用,香港 developer lab 為 2011 年 12 月於科學園舉辦,以下為筆者當年所拍之照片(因為 Android 4.0 Ice Cream Sandwich 版本於同年四月已經發布,所以當時教材階以 ICS 為例)。 其後因應系統發展, Support Library 亦陸續加入不少新功能,如 Grid Layout 、Action Bar、Notification 等等, 使得開發向後支援的軟件都變得更方便。 除了官方的 Support Library,坊間一直有不同的第三方 Library 為 Support Library 作補完。例如 Jake Wharton 用以顯示 Action Bar 的 ActionbarSherlock 基本上是每個軟件必備,直到 Support Library revision 18 加入了 Action Bar 才被取代。有以上的 Library 幫助,要編寫一個向後支援的軟件基本上已經沒有技術上的問題了。 Opensignal 最後講到要設計一個成功的軟件,必須要使所有尺寸的螢幕顯示正確。以下為筆者的開發心得: 要設計一個能支援所有尺寸的 UI 主要考慮到三點,一是螢幕大小、二是螢幕密度、三是顯示方向.
- 螢幕大小歸納了幾種: small、normal、large 及 xlarge,還有 3.2 打後的最小邊長 swXXXdp 等。由 1.6 版本開始,Google 已經向開發者說明 UI 設計應該使用 Density-independent pixel(dp / dip) 作為計算單位。所以,首先注意的是每一件元件都要以 dp 來作單位,而不是 px。再配合不同 Qualifier 就可以為不同大小的螢幕設定不同的排版 (如:layout-small、layout-xlarge、layout-sw600dp)。排版時要善用 weight 及 9.patch 圖片,這樣系統顯示版面時會自動為不同螢幕大小修正長度。
- 螢幕密度大概分為 ldpi(舊螢幕,基本上可以不理)、mdpi、hdpi、xhdpi 、xxhdpi、xxxhdp(Nexus 5) 及 tvdpi(Google TV 及 2012年版的 Nexus 7),根據 1. 的排版,就可以製作不同大小的圖像應用到不同密度的螢幕。圖像大小可以以 mdpi 作為參巧值,如一個 50*50px 的圖片,在 hdpi 可以製作成 75x75px,xhdpi 為 100*100px。除質素提高外,較大的圖像所製作的按鈕在高密度的螢幕會較為好按。如果用家的設備開發者沒有制作相應的圖像資源,系統則會自動縮放現有的資源顯示。如要偷懶的話,可以只為 hdpi 或 xhdpi 製作圖像,但細小的螢幕可能會出現圖像過大的情況(可強制 dp 解決),而自動縮放亦都會使圖像質素下降,及較為耗電。
- 基本上只要為 1. 所排的版面再以不同方向排版一次,如有需要的話可以配合 Fragment 為不同的方向製作不同版面。當然,再懶的話就強制只有一個方向亦無不可。
Android 碎片化為開發者帶來的問題,在 ICS 推出後已經變得越來越不明顯。只要配合上述之不同技巧,要開發一個軟件支援市面上九成九的設備其實唔難。當然,對比起 iOS 來說,Android 要測試多種螢幕使用了額外時間是無法避免的,還有其他硬體帶來的問題確實會偶爾發生,但最少在技術上要解決是沒有問題的,只是要選擇是否投資時間到那些設備上。 以後有機會筆者會再為大家介紹開發的技巧,希望讀者們多多支持。