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

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

背景

咱們從開發角度來考慮,但凡想從事長遠的開發工做,都有本身的技術積累,最簡單的就是一些UI組件和功能組件的封裝。android

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

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

問題

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

  1. 要跨平臺,最基本的是選擇一個第三方語言,若是考慮運行時確定首選JavaScript或lua之類的腳本語言。也能夠像xamarin那樣用編譯型語言,不過難度確定更大。框架

  2. 若是要ui也跨平臺,不考慮html的話,就得使用JSON或XML來描述ui層次結構。工具

  3. 若是用JSON和XML描述,就得須要有可視化的工具來方便用戶開發ui,不然直接文本編輯不可想象。佈局

  4. 若是使用JS,須要選擇JS引擎,是JSCore仍是V8,這須要研究差別和優劣。動畫

  5. Android最基礎的Activiy如何封裝,在iOS對應UIViewControlller?生命週期怎麼考慮?確定須要考慮多層,多層之間數據如何交互?ui

  6. JS引擎實例整個App就用一個仍是多個?須要釋放嗎?如何釋放?

  7. Android的文件管理和iOS的如何統一?兩者有類似處,也有很大差別。

  8. 線程怎麼處理,容許App業務開發者直接構建和使用線程嗎?

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

  10. 雖然不是以H5爲核心,可是webview確定要支持,那webview裏的h5如何和原生交互?如何讓webview加載的h5的js和跨平臺框架的js之間通訊?

  11. 確定須要一個統一的事件機制,包括button點擊這種系統事件的處理,也包括自定義事件,如何設計和實現android和ios的統一事件機制?

  12. 屏幕適配如何處理,這一塊很是麻煩,咱們的目標是讓App業務開發者儘可能不去考慮這種細節,如何設計和實現?

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

  14. 相似列表類型的組件應該有一個統一的處理方式,列表的複用機制在android和ios裏都有相似的概念,android用ListView,iOS用UITableView,怎麼統一?

  15. 代碼編寫的時候怎麼調試?修改一點ui或邏輯代碼,如何立刻看到效果?可否單步?如何看到實時錯誤信息和調試信息?

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

  17. 代碼編寫完了,如何打包生成Android和iOS的安裝包?若是對外服務,如何替換證書,第三方的一些key,打包失敗了怎麼辦,這須要一個完整的雲打包服務,裏面有不少問題須要解決。

  18. 怎麼擴展功能?除了咱們之外,怎麼能讓其餘原生開發人員來擴展功能?

  19. 如何實現組件插件化,能夠根據須要裁剪,如何保證多個組件打包的衝突?

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

方案

每一個問題的解決展開來均可以分析很長,因此咱們只能先整體上簡單說一個大概。後續能夠針對具體的問題再單獨發文探討。
image

  1. 調試和最終的發佈App都是插件化,可裁剪的

  2. 有一個組件商店由咱們和其它原生開發者維護

  3. App開發者利用可視化IDE拖拽ui,利用js代碼編寫邏輯,填充數據,更新ui

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

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

實踐

DeviceOne從2015年初開始設計開發,到2015年9月份發佈,從發佈到如今一年半了,它已經不是一個研究項目了,而是服務衆多開發者的一個平臺級產品了,有幾百App上線了。這種跨平臺的想法我估計你們都不難想到,可是從設想到實現到產品,國內仍是少有的,咱們的努力證實這種思路是可行的並能達到了很好的效果,但願給你們帶來啓發。

相關文章
相關標籤/搜索