如今,手機和各類移動端應用現已經成為人們日常生活的重要組成部分,因此,應用的數量不斷飆升(如今已上線的安卓應用至少達到210萬[1])。對于安卓開發商,在應用領域競爭日益激烈的背景下,打造可以使終端用戶滿意的應用正變得空前重要。
作為安卓應用開發商的您知道使應用終端用戶滿意的關鍵是什么嗎?答案是高性能。實際上,96%的終端用戶都認為應用的性能非常重要[2]。下面,我們將討論能夠使終端用戶獲得滿意的用戶體驗的五種方式。
在進入正題前,我想先介紹一下高性能的定義以及它為何在使終端用戶獲得滿意的用戶體驗方面至關重要。
高性能的安卓應用能夠合理地使用設備資源,幫助終端用戶迅速實現目標任務。實際上,高性能應用還可縮短終端用戶體驗到的感知延遲。
在這里,感知延遲是一個重要術語:它是指終端用戶所體驗的從點擊按鈕到界面發生變化這段時間內的時間差。根據終端用戶所采取行動和數據獲取來源的不同,我們可以有很多種方法來縮短感知延遲。
現在,讓我們來分析一下終端用戶互動和數據加載的五種情景,探討作為安卓應用開發商的您能夠采取何種方式來縮短感知延遲,并讓應用對終端用戶需求做出迅速且貼心的響應。
1. 從最近的資源加載
您所開發的安卓應用的終端用戶遍布全球,并且毫無疑問,這些用戶越來越依賴移動化的生活方式。
您的終端用戶和向應用提供數據的網絡服務器之間的距離難以保證始終處于掌控之中,而這也正是延遲變長的主要原因。
為了減少感知延遲,您應盡可能從距離較近的的資源向應用提供大部分的數據;此外,許多未授權的API請求可在最近資源被清除,這樣就可以避免與后端服務器之間的往返傳輸,進而提高了對終端用戶需求的響應速度。
Akamai智能邊緣平臺[3]可提供開箱即用的服務。借助Akamai,您可以讓數據總是從最優化的資源加載,這樣就可以提高應用的性能,您的終端用戶也可以輕易地獲取數據內容。
2. 緩存和預取
許多從網絡服務器加載的資源常常都在不斷地進行重復使用。智能緩存機制可以將對象或API響應存儲一段時間,以供重復使用,從而縮短冗長的來回傳輸時間。許多網絡或圖像加載數據庫已經可以提供這種功能,您可以根據需要進行配置。這些緩存對象能夠瞬時加載,因此延遲時間很短,終端用戶根本不會察覺到有任何滯后。
有了這些數據庫,當緩存內容過期時,會對其進行標記,以便從網絡中重新加載。根據這些信息,您可以為數據庫設定保存再利用緩存對象的時間。許多這樣的數據庫也支持HTTP報文頭,比如max-age等。這可以幫助您在無需加速應用更新的情況下控制緩存能力以及直接從服務器加載的緩存內容的生命周期。
然而,在例如提供直播體育賽事比分的應用等一些情況下,緩存可能并不適用。對于此類應用,作為安卓應用開發商的您可以繼續從網絡加載數據。如果您從最近的資源加載數據(請見上文),對于提升應用性能的作用并不顯著。
在某些情況下,您可能知道終端用戶下一步將要做些什么。例如,電子書閱讀應用可以預知,當終端用戶正在讀一本書的某一頁時,他們可能會向前或向后翻。基于這種認知,該應用可以提前預取幾頁然后進行緩存。這樣,當終端用戶翻到這幾頁時,頁面就可以瞬時加載。
類似的,在電商應用中,如果終端用戶瀏覽到第四行的商品,他們有可能也會翻看下一頁的商品。如果應用能預取下一頁內容并進行緩存,那么當終端用戶翻到下一頁時,數據就可以瞬時加載。
正如您看到的這樣,您可以使用多種方式預取并緩存數據,以此降低感知延遲,從而提高終端用戶的使用的滿意度。
3. 迅速加載API的響應速度
應用頻繁使用API。如果API響應能迅速加載,那么終端用戶不必耗費太多等待時間,而將更多時間用于使用應用上。
為此,您作為安卓應用開發商需確保有盡可能多的應用從盡可能近的資源(即:網絡邊緣,請見上文)中加載。這樣,只有那些必須訪問源服務器的API請求,才需要經歷可能長達半個地球距離的漫長“旅程”。
另一種方法是縮減應用和后端服務器之間傳輸的數據大小,以此加快API響應速度。為此,您可以探索Colfer[4]或谷歌的協議緩沖[5](也稱為Protobuf)等數據格式,而不是JSON。在將數據傳至網絡之前需將數據轉化為二進制,與JSON相比,這種格式可大幅縮減API請求/響應的字節長度。值得注意的是,為了啟動與Protobuf的協作,您的網絡服務器和應用都需要額外的投入;不過,在許多情況[6]下,采用Protobuf獲得的性能提升遠超過啟動它所需做出的努力。
迅速加載API的響應速度、優化感知延遲的第三種方法是緩存或預取可預測且重復的API響應。在緩存時,作為安卓應用開發商的您可將API響應存儲至本地數據庫表中,這樣讀取速度就能比從網絡中讀取的速度更快。這個本地數據庫可根據自己的邏輯加以清空或刷新,不過,從本地數據庫加載,然后再刷新的過程有助于實現最佳性能及最短的感知延遲。
4. 優化圖像和視頻
除了API之外,終端用戶還可能需要加載很多的圖像和視頻。一般來說,應用加載的圖像也可在同一應用的網站等其它地方使用。
與移動端應用相比,使用電腦打開的網站圖像對屏幕大小、分辨率和設備類型的要求有所不同。很重要的一點是,應用上的圖像需要根據資源有限的移動設備進行優化。移動端應用上的視頻亦是如此。
即便當這些媒體從最近的資源加載數據,它們也可能達不到最快的速度;因此,作為應用供應商,您還需要確定圖像和視頻是否得到了優化。這些對象的絕對大小以及全球移動數據網絡的不可預測性很容易抵消您僅用就近服務器就能實現降低延遲的優勢。
為了實現這種優化,需要確保移動端應用具有最合適的分辨率和大小,以便加載圖像或視頻。如果這些設備太大,那么下載就會花費很長時間;如果它們太小,那么在屏幕上則會顯示馬賽克。
Akamai圖像管理器(Akamai Image Manager)[7]是一種可以幫助安卓應用開發商利用單一的高質量原圖對諸多移動設備進行自動優化的解決方案。這種優化也可使圖像和視頻的緩存變得更加容易。如果設備類型數量有限,您也可以存儲同一張圖像的多份不同副本。
圖像常常包括很多不常用于應用中的EXIF數據[8](例如,拍照時設置相機細節)。Akamai Image Manager可對此進行自動優化,不過您也可以利用tinypng[9]等服務手工清除這些數據。這種優化可以縮小圖像文件的大小,從而縮短加載時間。
另一種優化方式是利用漸進圖像和自適應視頻流。借助這種優化,終端安卓應用就無需等待整張圖像下載;應用可逐步地下載這些圖像,并在其下載時就開始顯示。這可避免終端用戶進入空白圖像視圖,同時縮短感知延遲。類似的,自適應視頻緩沖技術可根據網絡條件動態地調整視頻質量。當帶寬較小時,它可調低視頻分辨率,以便終端用戶能看到部分視頻,而不是僅看到正在加載中的屏幕。
除了PNG和JPEG圖像,您也可以嘗試WebP格式。雖然創建WebP格式的圖像需要花費更多時間,但加載時卻更加高效。在本地或網絡加載過程中,嘗試SVG圖像是另一種節省磁盤空間的有效方法。
5. 優化本地動畫和過渡
動畫在幫助終端用戶獲得滿意的用戶體驗、以及告知用戶活動方面起著重要的作用。與性能相比,動畫與感知延遲有著更明顯的關系。
過長的動畫加載時間會使終端用戶感到煩躁和無趣;太短或卡頓的動畫會讓終端用戶難以理解內容的含義。兩種情況都會給您的終端用戶留下不好的體驗。電池耗量也是設計精良的動畫必須考慮的一個方面,動畫在提供愉悅的用戶體驗的同時,還需要做到消耗盡可能少的資源。
根據Material Design guidelines by Google[10],移動設備上較長的動畫的長度為300-400毫秒,較短的動畫為150-200毫秒。比這些更長或更短的動畫可能會讓人感覺有滯后或是難以跟上。Material Design guidelines on motion[11]是通過例子了解這些時間范圍的好選擇。
所以,為了讓終端用戶更好地理解短動畫的內容,動畫的持續時間應在150-200毫秒之間。類似的,任何過渡輔助(比如從一個屏幕轉到另一個屏幕)都不應長于400毫秒。傾向于重復的動畫(比如進度條)應遵循類似的原則。單段動畫的長度可以在300-400毫秒之間,這樣它就可以在進度條退出前進行循環。
如果您想了解更多關于人類感知動作的信息,請閱讀名為Human Processor Model[12]的研究。
結論
高性能的關鍵是綜合考慮數據細節并謹慎地利用資源。幸運的是,我們有很多種方式來實現這個目標。
除了上述五大秘訣之外,我還想向安卓應用開發商強烈推薦另外兩種資源——The Art of Computer Programming[13]和Introduction to Algorithms[14],它們可以幫助您遵循最佳編碼實踐并利用最高效的算法,打造高性能的安卓應用,使終端用戶獲得滿意的用戶體驗。
關于作者:
Aman Alam Akamai開發者布道師
[1]https://www.statista.com/statistics/276623/number-of-apps-available-in-leading-app-stores/
[2]https://content.akamai.com/PG7125-unlocking-mobile-application-performance.html
[3]https://www.akamai.com/cn/zh/about/news/press/2018-press/akamai-announces-platform-enhancements-designed-to-bolster-security-and-agility-for-digital-businesses.jsp
[4]https://github.com/pascaldekloe/colfer
[5]https://developers.google.com/protocol-buffers/
[6]https://auth0.com/blog/beating-json-performance-with-protobuf/
[7]https://developer.akamai.com/akamai-image-manager
[8]http://exifdata.com/
[9]https://tinypng.com/
[10]https://material.io/design/
[11]https://material.io/design/motion/speed.html
[12]https://en.wikipedia.org/wiki/Human_processor_model
[13]https://www.amazon.com/Computer-Programming-Volumes-1-4A-Boxed/dp/0321751043/
[14]https://www.amazon.com/Introduction-Algorithms-3rd-MIT-Press/dp/0262033844