LuaView高性能、動態化、跨平臺應用開發引擎—聚劃算動態化之路

EthRWC 8年前發布 | 69K 次閱讀 Lua 高性能 Lua開發

 

1. 移動開發困局

業務快速發展的互聯網產品,其移動應用往往會遇到版本迭代速度跟不上需求變更速度的問題。這時候讓應用具有動態化能力就顯得尤為重要。所謂的動態化是指應用不發版實現內容動態更新的能力,這里的應用內容不僅限于基本信息(如售賣的商品信息),而且涉及應用的主體框架、信息結構等深層信息(如頁面整體排版、布局)。比如聚劃算3.8大促,可能需要臨時對線上活動進行一個大的調整,如果采用Native技術實現的話,正常的發版節奏顯然無法支持這種變更,但如果應用具有動態化能力的話,就可以通過動態發布解決上面的問題。

為了達到應用內容動態更新的目的,業內先后出現過很多動態化方案。有部分Native、部分Html5的混合架構Hybrid App,這種方案以H5的動態性為基礎,通過定義Native的擴展(Bridge)來實現動態化;有約定數據結構,使用Native進行渲染的Native View方案,通過修改預定結構中的數據,實現動態化;有現在火熱的ReactNative技術,通過JavaScript腳本引擎支持頁面DOM轉換和邏輯控制來實現動態化;還有開源界一大批小眾的動態化方案。這些動態化方案都能一定程度上賦予APP動態化能力,但是每種方案都有其不太讓人滿意的缺陷以及能力瓶頸,如Hybrid的H5部分體驗較差;Native View結構變化不夠靈活,不支持邏輯的動態化;ReactNative 的JS引擎過重,不適合做長列表等。總之,尚未出現一種可以一統江湖的動態化方案。

聚劃算目前正處在業務高速增長的時期,業務需求應接不暇,中間還穿插各種需求變更,基本的發版節奏已經很難滿足業務需求,而h5的體驗又不能很好地支持業務,能否構建一套Native動態化方案就變得非常迫切。在這種情況下,聚劃算開始了自己的動態化之路。

在最初的時候,我們的工程師采用Native View方案構建了一套名為Box的簡單動態化系統(如圖)。通過預先約定好前后端Json數據格式和解析規則,在Android、iOS端以相同的方式解析、渲染服務端數據,從而實現兩個端的簡單動態化頁面。Box能做到圖片以及鏈接的動態配置與變更,但Box最主要的問題是只能下發結構預先定義的數據,并且不能下發處理邏輯,這就造成Box系統的適用范圍非常有限,只能處理預定結構的服務端數據,無法構建復雜的UI,無法支持個性化Native頁面。

為了更好地支持頁面動態化,支持復雜UI,支持邏輯下發,我們又繼續向更高級的方案出發,這就是接下來要介紹的方案—LuaView,說到LuaView,首先要從Lua語言說起。

2. Lua腳本語言新探索

Lua腳本語言的設計初衷是可以方便地嵌入到其他語言中,為應用程序提供靈活的擴展和定制功能,現實中的Lua更是不僅可以作為應用程序的擴展,還可以作為應用程序的配置文件。同時Lua腳本語言已經被廣泛地用在各種場合以及應用程序中,游戲領域有大名頂頂的Minecraft、魔獸世界、憤怒的小鳥等;應用領域有Adobe Photoshop Lightroom。

Lua腳本語言的內核非常小,官方Lua 5.0.2的內核只有不到120KB,這使得Lua腳本的啟動非常迅速,在所有腳本引擎中,Lua是平均意義上最快的。在嵌入式和移動領域,體積小,啟動快是一個極大的優勢。此外,Lua腳本還有容易理解,易于維護等優勢。

Lua腳本語言有著極強的可擴展能力。雖然Lua并不象其它許多”大而全”的語言那樣,包括很多功能,比如網絡通訊、圖形界面等,但是Lua提供了非常易于使用的擴展接口和機制,可以輕松通過宿主語言完成能力擴展。

總之,Lua腳本語言具有可擴展性強、簡單、高效、占用體積小、啟動速度快等諸多優勢,同時已經被業界使用多年,有著許多成功案例,是動態化方案首選。

在聚劃算中最普遍的動態化需求是開發一個活動頁面,基礎活動頁面的開發需要兩種能力,一種是邏輯處理能力,這個Lua本身已經具備,一種是UI視圖構建能力,這個Android、iOS原生已經支持,高級活動頁面的開發可能還需要原生系統的其他能力,如網絡、存儲、硬件控制等,這些Android、iOS原生系統也已經支持,因而我們的動態化方案核心就變成了如何將Android、iOS原生的UI、網絡、存儲、硬件控制等能力橋接到Lua層,有了這些能力,我們的動態化方案就可以支持UI動態搭建、腳本、資源、邏輯動態下發。借助Lua語言的可擴展性,我們可以很方便地在Native跟Lua之間搭建起橋梁,將Native的各種能力遷移到Lua層。

3. LuaView設計原則

在Native跟Lua交互的諸多能力中,以UI視圖構建能力最為基礎,因而我們將最終產出的動態化方案命名為LuaView,意為使用Lua構建Native UI。

使用Lua腳本語言實現Android、iOS動態化,面臨最大的一個挑戰是:避免重新開發一套UI庫的前提下,在Android、iOS系統之間構建一套統一的Lib庫,并且保證兩個端的Lua腳本代碼一致,特性一致,做到Write Once Run Both。

為了避免大動干戈開發一套UI庫,我們選擇借用兩個平臺的原生UI庫。同時我們選擇了現有的成熟的Lua引擎(LuaJ & LuaC),并稍作修改以適應移動端的需求,通過構建橋接平臺,小心地設計Lua層API,最終做到了Write Once Run Both,并且上層API表現上也很自然。

3.1 LuaView SDK整體架構

如圖,LuaView SDK的整體架構可以表示為五層。

自下而上第一、二層依次是OS層和Framework層,分別表示了Android、iOS以及對應的框架層。

緊接著是Lua虛擬機,在Android、iOS平臺分別是LuaJ和LuaC,兩個虛擬機都是目前兩個語言中用的最廣泛,最穩定的虛擬機。

處在第三層的還有腳本管理模塊以及安全控制模塊,它們分別負責Lua本地腳本管理(包括腳本的解包、驗證、加解密、解壓縮等工作)和Lua腳本的安全校驗工作(腳本完整性校驗以及腳本安全校驗等)。

處在第四層的是LuaView的核心Lib庫,包括兩部分,一部分是Lua UI Lib,主要是所有的UI組件(如Button、Label、Image、TableView等);一部分是Lua Non-UI Lib,主要是所有非UI組件(如Http、Json、Audio等)。

處在最上層的是Lua業務腳本代碼以及Lua層的Lib庫(方便第三方使用的Lua寫的Lib庫)。

3.2 LuaView兩個重要設計原則。

Write Once Run Both:

LuaView的一條重要設計原則就是同一份邏輯只寫一份代碼,這需要在設計SDK的時候盡可能得考慮到兩個端的共性跟特性,將API構建在兩個端的共性領域中,對于兩端的特性領域則交由各自的Native部分來實現。目前LuaView SDK的Android端、iOS端已經完成輸出統一的Lua接口,同時保證API特性一致,做到一份腳本兩個端運行出來的效果一致。做到一份腳本跨Android、iOS平臺運行。

Simple & Easy:

LuaView的另一個設計原則是保持Lua語言的簡單和易用。核心UI庫上,所有的API做到精簡,能夠使用腳本實現的,盡量避免使用Native來實現。設計API的時候保證所有的LuaView 語言層使用Lua原生語法,所有的UI控件庫接口跟Android、iOS保持一致風格,方便兩個端開發人員的遷移。

4. LuaView動態能力

LuaView的動態能力基本上可以跟Html5匹敵,做到數據、資源、頁面結構,甚至代碼邏輯的動態下發,并且LuaView支持本地代碼&資源緩存,可以有效降低每次加載的時間,減少不必要的服務器交互,提升頁面加載速度。

LuaView既可以作為完整頁面,也可以作為某個視圖組件使用(這是Html5很難做到的一點),同時還支持Native組件注入,很好地滿足了完整APP,現有APP部分功能替換以及現有組件接入LuaView動態能力等場景。

頁面級場景:

LuaView可以承載獨立頁面,一個頁面的所有功能都使用Lua腳本開發,同時SDK提供了腳本&資源緩存,腳本下載&解包等功能,能夠快速支持業務開發。新開發一個完整頁面的情況下,非常適合此種場景。

組件級別場景:

LuaView可以作為獨立的UI組件,嵌入到任何視圖樹中,同時該塊UI組件可以跟Native交互,具備動態更新能力。對于頁面已經開發完成,但某塊成熟業務中某些內容需要頻繁變更的時候,非常適合此種場景。

Native組件注入場景:

將一個應用原有的Native UI組件作為子UI注入到LuaView中,同時支持該Native UI組件調用Lua層代碼,Lua代碼也可以做到動態更新,從而實現Native UI組件功能的動態變更。對于頁面已經開發完成,但某塊UI處理邏輯需要動態變動的時候,非常適合此種場景。

5. LuaView現狀&后續工作

LuaView目前已經在線上運行將近半年時間,支持了聚劃算多個垂直業務,表現穩定。

后續LuaView主要圍繞以下三方面進行工作:

1. API完善

LuaView是構建在兩個不同平臺的統一框架,為了在Lua層屏蔽掉兩個平臺各自差異,需要我們持續完善我們的API設計,其中涉及到增加新的共性API,去除老的不兼容API,采用更優方式實現API統一等。

2. 性能&結構優化

LuaView畢竟是在已有的Native Framework框架上又搭建起來的新層,性能必然會有損耗,如何將這種損耗降低到最低,達到最優,是我們一直在做的事情。另外,為了更方便的支持上層業務開發,需要將Lua API以及結構梳理地更順暢,進一步減少學習成本。

3. 文檔、Demo、支持工具豐富化

LuaView尚處在發展前期,各種文檔支持、Demo示例,以及支持工具都還不夠完善,需要LuaView團隊以及整個社區的支持。

6. 開源

為了更好地回饋社區,提升整個無線社區的開發效率,同時也讓更多的人參與進來,借助社區的力量提升整個項目質量,讓LuaView真正成為一個能夠服務更多團隊的框架。我們已經將LuaView項目整體開源,項目地址 https://github.com/alibaba/LuaViewSDK

目前我們開源的主要內容包括LuaView-iOS、LuaView-Android、LuaViewDebugger等。為了方便大家入手,我們還整理了所有的API,形成了APIDoc,供大家參閱。此外我們還有豐富的測試腳本,可以幫助大家快速入門。

來自: infoq

 本文由用戶 EthRWC 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!