您的位置:首頁>科技>正文

基於原生的移動跨平臺研究和實踐

基於原生主要是針對基於webview+h5比較來說的, 基於H5的我不想再討論了, 我想嘗試的是從UI到功能都是原生, 而不是用H5模擬的所謂原生體驗。

背景

我們從開發角度來考慮, 但凡想從事長遠的開發工作, 都有自己的技術積累, 最簡單的就是一些UI元件和功能元件的封裝。

舉例, 我在一個App裡實現了一個點擊一下能自動切換背景顏色的Button, 包括點擊的動畫效果, 我肯定會考慮封裝成一個類, 比如叫MyButton, 在Android下它繼承Button類, 在ios下它繼承UIButton類。 做下一個App, 我要重用就把MyButton類檔直接拷貝到新專案裡, 或者引用一個jar包或a檔。

還是不夠,

我還想進一步, 我想讓做App的開發和做原生的開發徹底分離, 原生開發人員不需要理解和接觸任何App業務, 只需要封裝類似MyButton這種元件提供給App開發人員使用, 而App開發人員是不需要懂android和ios技術的開發人員。 ReactNative只能做到部分分離, 做不到真正的跨平臺, 我想做到真正的一次開發跨Android和iOS平臺, 有沒有可能實現, 怎麼實現?

問題

設想很簡單, 但是真正仔細去研究可行性, 會發現巨量的問題和細節需要考慮和研究, 我先列出19個基本問題:

要跨平臺, 最基本的是選擇一個協力廠商語言, 如果考慮運行時肯定首選JavaScript或lua之類的指令碼語言。 也可以像xamarin那樣用編譯型語言, 不過難度肯定更大。

如果要ui也跨平臺, 不考慮html的話, 就得使用JSON或XML來描述ui層次結構。

如果用JSON和XML描述, 就得需要有視覺化的工具來方便用戶開發ui, 否則直接文本編輯不可想像。

如果使用JS, 需要選擇JS引擎, 是JSCore還是V8, 這需要研究差異和優劣。

Android最基礎的Activiy如何封裝, 在iOS對應UIViewControlller?生命週期怎麼考慮?肯定需要考慮多層, 多層之間資料如何交互?

JS引擎實例整個App就用一個還是多個?需要釋放嗎?如何釋放?

Android的文件管理和iOS的如何統一?二者有相似處, 也有很大差異。

執行緒怎麼處理, 允許App業務開發者直接構建和使用執行緒嗎?

Android除Activity之外還有services等基礎元件, iOS找不到對應的, 如何統一?

雖然不是以H5為核心, 但是webview肯定要支持, 那webview裡的h5如何和原生交互?如何讓webview載入的h5的js和跨平臺框架的js之間通信?

肯定需要一個統一的事件機制, 包括button點擊這種系統事件的處理,

也包括自訂事件, 如何設計和實現android和ios的統一事件機制?

螢幕適配如何處理, 這一塊非常麻煩, 我們的目標是讓App業務開發者儘量不去考慮這種細節, 如何設計和實現?

佈局怎麼設計, Android有很多佈局類, iOS少一點主要是絕對佈局, 這一塊如何統一?

類似清單類型的元件應該有一個統一的處理方式, 清單的複用機制在android和ios裡都有類似的概念, android用ListView, iOS用UITableView, 怎麼統一?

代碼編寫的時候怎麼調試?修改一點ui或邏輯代碼, 如何馬上看到效果?能否單步?如何看到即時錯誤資訊和調試資訊?

Android和iOS的閃退怎麼辦?App開發者不懂android和ios如何面對閃退問題?

代碼編寫完了, 如何打包生成Android和iOS的安裝包?如果對外服務, 如何替換證書, 協力廠商的一些key,

打包失敗了怎麼辦, 這需要一個完整的雲打包服務, 裡面有很多問題需要解決。

怎麼擴展功能?除了我們以外, 怎麼能讓其他原生開發人員來擴展功能?

如何實現元件外掛程式化, 可以根據需要裁剪, 如何保證多個元件打包的衝突?

我只是列出一部分技術問題, 而且每個問題的不同解決方案都會帶來無數小的問題。 我們想實現這個框架對外服務, 除了技術環節外, 還有不少非技術的因素我們暫且不提。

方案

每個問題的解決展開來都可以分析很長, 所以我們只能先總體上簡單說一個大概。 後續可以針對具體的問題再單獨發文探討。

調試和最終的發佈App都是外掛程式化, 可裁剪的

有一個元件商店由我們和其它原生開發者維護

App開發者利用視覺化IDE拖拽ui, 利用js代碼編寫邏輯, 填充資料, 更新ui

有一個雲打包系統把App開發者開發的js代碼和ui文件和原生開發的元件合併編譯打包

核心框架包含運行時腳本引擎解析js代碼, 包含ui解析引擎解析json並構建原生ui樹。

實踐

DeviceOne從2015年初開始設計開發, 到2015年9月份發佈,從發佈到現在一年半了,它已經不是一個研究專案了,而是服務眾多開發者的一個平臺級產品了,有幾百App上線了。這種跨平臺的想法我估計大家都不難想到,但是從設想到實現到產品,國內還是少有的,我們的努力證明這種思路是可行的並能達到了很好的效果,希望給大家帶來啟發。

到2015年9月份發佈,從發佈到現在一年半了,它已經不是一個研究專案了,而是服務眾多開發者的一個平臺級產品了,有幾百App上線了。這種跨平臺的想法我估計大家都不難想到,但是從設想到實現到產品,國內還是少有的,我們的努力證明這種思路是可行的並能達到了很好的效果,希望給大家帶來啟發。

Next Article
喜欢就按个赞吧!!!
点击关闭提示