摘要前端
一個電商類 APP,對用戶而言,是琳琅滿目的商品,是層出不窮的優惠,既是社交導購,更是交易售後;而對於開發者來講,用戶行爲的背後,或許僅僅是一次次數據的存儲、處理、傳輸和展現。android
在蘇寧易購 android 客戶端不斷髮展的過程當中,也出現了許多的問題:小程序
如何高效、安全的處理數據流向的各個環節?微信小程序
如何規避軟件升級、硬件差別、網絡環境等攜帶的風險?緩存
如何合理的解決產品快速迭代和開發目不暇接之間的矛盾?安全
若是最大限度的提升開發效率,下降開發、管理和運營的成本?微信
......網絡
有問題,就有對應的技術方案,就須要合理的架構去支撐。架構
本文將根據移動發展各個階段的時代特色,結合移動電商 app 業務的特質,以移動數據交互全景的視角,講述蘇寧易購 Android 客戶端在不一樣階段出現的問題,採起的技術應對方案,以及如何衍生出最終的 Android 運行架構。app
移動青銅時代(2012-2014)時代特色:
移動特徵,2G~3G 網絡爲主,數據傳輸效率低,電商類 APP 用戶的活躍性低;
發佈模式,傳統的軟件生命週期,需求收集、評審 → 測試案例生成、評審 → 開發設計、編碼、評審 → 測試 → 發佈 → 運營,單團隊單線發佈;
Android 生態,Android 2.0~3.0,行業內都處於探索階段,技術交流少,多以系統 API 爲主;開發工具 Eclipse。
APP 業務特徵:
業務系統,以 PC 業務爲主,沒有針對移動業務數據的 API,須要單獨研發一個數據中轉系統,以保持移動業務的正常運轉;
產品邏輯,展現、交互簡潔,業務複雜度低,以商品的搜索、展現、購買等核心流程爲主;
移動應用數據交互全景:
研發過程當中的問題:
因爲業務邏輯簡單,頁面展現、交互的複雜低,經過 Android 原生的 Activity+WebView 便可以知足絕大部分的產品需求;需求、開發、測試、發佈、運營都在正常的版本週期內有條不紊的進行着;在 Android 發展初期,最主要的問題就是:
如何提升開發者的編碼質量。
技術應對方案:
資深人力資源對核心技術進行封裝,高內聚,低耦合;以最精簡的 API 對外,下降使用複雜度,讓開發人員專心於業務邏輯的研發。
應用架構生成:
採用最基本的軟件設計理念,即分層 + 解耦:
分層,數據流轉處理採用責任鏈模式,保證各個環節的邏輯清晰明瞭;
解耦,各層之間添加標準的 API 代理,確保被依賴層能夠正常的維護、升級。
時代特色:
移動特徵,3G~4G 網絡爲主,數據傳輸效率高,高效便捷的購物體驗,讓手機購物成爲了主流;
發佈模式,單線已經沒法知足各條產品線的快速迭代,敏捷開發應運而生,多團隊多線發佈;
Android 生態,Android 4.0~5.0,移動技術交流百花齊放,插件化、熱修復、APK 加固等黑科技如虎添翼;開發工具 Eclipse → Android Studio。
APP 業務特徵:
業務系統,以移動業務爲主,提供針對移動業務特徵的 API,廢棄原有的轉接系統,一方面提升移動數據的傳輸、處理速度,一方面下降單一系統異常帶來的移動體驗風險;
產品邏輯,除了核心的商品搜索、展現、交易,評價、社交、導購、物流等都開闢出單獨的產品線,以知足用戶使用過程的各類需求;
移動應用數據交互全景:
研發過程當中的問題:
若是說一個產品從出現到成熟,必定要通過一個「戰爭期」的話,我想必定是這個時期了,摘要裏列出的大多數問題都爆發在這個階段,
1 軟\硬件差別方面:
App 在 Android_x.x 上是能夠運行的,在 Android_y.y 就不行
App 在其餘手機上均可以跑,就 XXX 手機不行
2 網絡環境方面:
App 在 WIFI 正常顯示數據,切到 3G 顯示異常
App 在運營商 1 網絡下正常顯示,在運營商 2 網絡下一片空白
XX 省請求數據超時嚴重,其餘地區正常
3 產品運營方面:
XX 需求必定要跟着 App 版本走麼,能不能明天就上,否則活動就過時了
HTML5 體驗太差了,能不能讓開發優化下
這個頁面在 App 已經作好了,讓開發直接用,這個不算開發時間
4 開發測試方面:
這個控件能不能抽出來公用,每次都是各自複製代碼
頁面跳轉都是寫死的,抽離代碼,都是報錯,改動太多
會員數據、手機軟硬件數據能不能提供 API,如今都是另起爐竈,代碼冗餘太多
跑一次工程太慢了,65535 是什麼狀況
爲啥商品頁面的改動,還須要把會員相關的場景都測試一遍
線上不能直接修改已發佈 APP 的 bug,每次有問題都要從新發布,嚴重浪費資源
5 APP 性能方面:
有用戶反饋,點擊 XX 頁面就閃退
用戶又反饋,首頁展現的很是慢
還有用戶反饋,瀏覽了幾頁就提示 APP 未響應
技術應對方案:
雖然出現了不少問題,可是這個階段出現的技術方案,針對性並不強,都是根據生產版本出現的問題,施加的通用手段,具體以下:
完善 App 的監控機制,對 App 的奔潰、HTTP、內存、CPU 等指標數據,進行全面採集分析,確保問題的快速響應、定位、解決;
完善的用戶反饋機制,讓用戶能夠便捷的反饋,讓開發者能夠第一時間收到反饋並解決問題;
HTTP 加速(MAA),優化請求鏈路,確保各項業務數據的快速響應;
HTTPDNS,下降 DNS 劫持的風險;
Chromium 引擎,使用 Chromium 引擎的 WebView 替代原生的 Webview,保證 HTML5 的快速渲染,提高用戶的購物體驗;
熱修復,對已發佈 APP 的問題,進行在線修復,最大程度的減小問題影響;
VR/AR,增長現實、虛擬現實技術的運用,用「神奇」進一步提高促銷推廣的影響力。
Android Studio,伴隨着 Android Studio 的出現,一方面經過 gradle 提高編譯速度,另外一方面配合 MultiDex 同步解決 Dex 容量的問題;
而相比 app 的性能問題,產品缺陷、開發缺陷以及體驗問題,纔是這個階段最主要的問題,因此在這個階段,項目裏面的全部人,天天都在看監控、看用戶反饋,發現問題解決問題。
應用架構生成:
而對於客戶端,也在想法設法的在架構上提升開發質量,主要手段以下:
路由、消息機制,用戶模塊間跳轉,去除不一樣業務模塊之間的耦合,同時也是爲了業務的模塊化、插件化作準備;
模塊化、插件化,物理隔離不一樣性質的業務代碼,一方面知足產品快速迭代的需求,另外一方面減小蝴蝶效應,同時責任明確,促進高效開發;
服務化,通用 UI,抽離成高獨立的控件,造成 UI 服務;對於通用的數據獲取、處理、存儲,按性質抽離成可拓展的數據處理機制,造成數據服務;
時代特色:
移動特徵,4G 網絡爲主,數據傳輸速度 + 流量已經不在是移動 APP 的瓶頸,移動設備的物理性能大幅度提升;
發佈模式,敏捷開發模式運用成熟,多產品線靈活發佈,可集成發佈、也可獨立發佈;
Android 生態,Android 6.0~7.0,插件手段運用成熟,前端頁面渲染更加高效,Weex/ReactNative、微信小程序等成爲新趨勢;開發工具 Android Studio。
APP 業務特徵:
業務系統,在傳統的業務系統上,系統更加安全、高效、多樣、智能,接入、升級更加靈活;
產品邏輯,視頻直播、虛擬現實、人工智能成爲主流元素,商品銷售定位更加精細。
移動應用數據交互全景:
研發過程當中的問題:
不一樣於前面的發展階段,這個階段出現問題(或者說是技術需求)針對性都很是強,主要以下:
數據安全方面,APP 界面出現廣告;用戶信息被抓包獲取;
HTTP 速度方面,有些偏遠地區,移動請求速度長達 3~5s,如何解決;
消息推送方面,客服的消息、活動的信息、物流的狀態如何在第一時間告訴用戶;
前端體驗方面,前端頁面滑動卡段、加載慢、交互延遲,如何優化。
產品獨立方面,有些產品功能作大作強,如何快速造成獨立 APP。
技術應對方案:
全站 HTTPS,增強數據安全,減小內容劫持,保障用戶隱私,促進購物體驗;
HTTP2.0,在統一接入層(域名收斂)的基礎上支持 HTTP2.0,減小 DNS 解析、請求鏈路複用,進一步加快移動 APP 的數據交互;
雲信系統,一方面知足客服消息、活動信息、物流狀態的推送,另外一方面結合大數據、人工智能,實現真正的精準營銷;
Weex + 靜態資源緩存,引入 Weex 技術,配合 Webview 的靜態資源緩存技術,讓前端頁面體驗更加原生化。
與此同時,Google 在 Android Studio 上推出 Instant Run 用來加速 gradle 的編譯速度,進一步提高開發效率。
應用架構生成:
這個階段的架構調整,針對上述問題 5 作了不少精細的工做,一方面要顆粒化業務層、服務層、ADK 層,另外一方面還要調整原有的單向依賴關係,讓應用工程自己容器化,知足產品線的快速集成、快速獨立,實現 APP 研發的 DIY,主要調整以下:
完全落實模塊化、插件化,全部產品線開闢獨立工程,業務代碼徹底物理隔離,以 Android Library(aar) + Plugin(apk)的方式對外提供;
UI 控件、數據服務精細化,即保證全部 UI 控件、數據服務的高度獨立,讓使用方(業務層)自由取捨;
基礎 ADK 標準化,收集集團全部 APP 的技術需求,集中優秀人力資源打造超高性能 ADK,生成開發文檔並推廣,促進各產業 APP 高效研發。
5G 時代即將到來,有人說那是人工智能的時代,有人說那是物聯網的時代,也有人說那是虛擬現實的時代,技術改變人們生活習慣的同時,也給開發者帶來的各色各樣的問題,時代在變,技術方案在變,支撐技術的架構也在變。
變幻無窮的背後,惟一不變的、也是咱們持之以恆追求的,就是:「在掌握時代特色、業務特徵、軟硬件限制的前提下,合理利用各類資源,設計出最高效的開發方案。」
做者介紹李呈武,蘇寧易購前端技術專家,資深 Android 開發者,深度掌握 Android 虛擬機、插件化、Weex 等技術,熟悉移動網絡的特質,對移動端的架構設計有獨特的看法,一直致力於經過優秀的架構設計,減小開發成本,提高開發質量。