美思 [Solar2D] 程式設計教學:為什麼要用跨平台行動框架?

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

[注意事項] Corona 已改名為 Solar2D

本文對跨平台行動應用框架 (cross-platform mobile application frameworks) 和 Solar2D (原 Corona SDK) 進行一個概念上的介紹,不會太深入技術細節,如果已經熟悉這些概念的讀者可快速讀過或略過本文。

為什麼使用跨平台行動應用框架?

每種行動裝置都有自己的系統和 SDK (Software Development Kit),如果我們想要在不同裝置開發相同功能的軟體,開發者需針對每種系統重新寫一次。

由於同一個開發者同一時間只能做一件事,正規的作法就是養兩群以上的開發者,平行開發該軟體在各種行動裝置的版本;如果僅由同一群開發者開發兩種以上的版本,可能導致整個開發時程過久。

對於大公司來說,公司內有多個團隊是司空見慣的事情,但對於小團隊或獨立開發者來說,同時要開發和維護兩個以上的專案就成為一種負擔,跨平台行動應用框架就是針對這種議題而產生的軟體框架。

透過這類框架,開發者可在專案內共用 (大部分或全部的) 程式碼,再藉由這些框架所提供的工具轉換成不同平台的軟體。這類工具即是透過共用程式碼來縮短開發時間。

不過,天下沒有白吃的午餐,跨平台行動框架並不是萬靈丹,原生語言仍是預算充足時的首選。我們在下一節會討論這些框架所用的機制,並且說明什麼時候適合用跨平台行動框架。

註:原生語言是指行動平台官方指定的語言,像是 Java 或 Kotlin 用於 Android,或是 Swift 或 Objective-C 用於 iOS 等。

跨平台行動框架方案

一般來說,跨平台行動框架有以下三種方案:

  • 行動響應式網站 (mobile-responsive websites)
  • 混合模式應用程式 (hybrid applications)
  • 交叉編譯應用程式 (cross-compiled applications)

行動響應式網站嚴格來說不是行動軟體,而是網站,只是該網站的介面會隨著客戶端裝置的尺寸改變。透過 Bootstrap 或 Foundation 等框架的協助,製作這類網站的門檻大幅降低。但這類軟體無法使用行動裝置的硬體功能,而且在行動裝置上操作瀏覽器其實不是很親和,這類方案僅適用於分享靜態內容。

混合模式應用程式在 UI 上透過 WebView 顯現,其實內部仍然是透過瀏覽器來生成,但透過一些插件可使用行動裝置的硬體功能,是兼具網頁技術和行動裝置特性的軟體。跨平台行動框架的先鋒 Cordova 就是這類型的框架。這類框架上手容易,但早期行動裝置的效態相對不佳,使得這類軟體的使用者經驗不良。如果程式不吃效能,仍然可考慮這類方案。

交叉編譯應用程式則是使用單一語言撰寫後,再轉換成各平台的應用程式。這類型程式不透過 WebView 顯示 UI,通常會比混合模式應用程式來得快。有些框架會將 UI 部分程式碼分開,核心功能部分程式碼則共用,像是 Xamarin;有些則共用所有的程式碼,像是 NativeScript。前者在 UI 調整上較細緻,但程式碼量較多;後者程式碼量少,但可用的 UI 相對受限。

為什麼這類框架沒有完全取代原生語言呢?

  • API 版本落後於原生軟體
  • API 覆蓋率較低
  • UI 難以做細微的調整
  • 學習資源較少

如果很在意 UI 的呈現或是一些特定 API 的功能,最好還是用原生語言來開發。另外,比起原生語言,這類框架的學習範例相對少,通常只有官方的範例可看,在 Stackoverflow 等論壇的討論度也相對低。這類框架的主要目的在於節省預算和開發時間,適不適合自己的專案,仍需自行評估。

為什麼使用 Solar2D?

Solar2D (原 Corona SDK) 是一套跨平台行動應用框架,主打電腦遊戲 (mobile games),但其實也可用在應用程式 (business applications) 中。使用 Solar2D 的好處如下:

  • 易於安裝
  • 易於學習
  • 反應快速的模擬器
  • 免費使用
  • 豐富的 API
  • Corona 市集

如果有實際使用過一些行動框架就會知道,許多行動框架依賴數個外部軟體或套件,建置環境的過程相當麻煩且容易失敗,耗費許多時間在初期建置開發環境上。相對來說,Solar2D 將軟體包成單一安裝檔,建置環境的過程簡單,不用耗費時間處理開發環境的問題。

Solar2D 使用的手稿語言是 Lua,而 Lua 當初在設計時就有考量易用性,即使是非資訊相關科系的程式人,也可以很快地學會 Lua 的核心語法,用 Lua 來撰寫 Solar2D 應用程式。

Solar2D 的模擬器啟動相當快速,而且內建在 Solar2D 主程式中,不依賴 Android Studio 或 Xcode 的模擬器。模擬器啟動快速看起來不是什麼了不起的事,但在開發程式的過程中,要反覆地撰寫程式和用模擬器測試,這項特性可使開發的過程更順暢。如果和其他同質框架比較,可發現 Solar2D 的模擬器的反應速度真的是前段班,對於開發的迭代助益很大。

Corona 的核心功能是免費的,我們可以自由地下載 Corona,盡情地撰寫和測試程式,只要在開發的尾聲,加入特定的付費外掛,像是去除 Corona 內建登入畫面 (splash screen) 或是 AdMob 外掛等。付費功能皆是選擇性的,開發者可自行選用需要的功能,也可以不使用這些功能。

如果我們瀏覽一下 Solar2D 的 API 文件,就可以發現 Solar2D 已經將行動裝置常用的功能寫成 Lua API。如果內建 API 的功能不足,還可以到 Corona 市集逛逛,看有沒有符合自己需求的外掛。不過,Solar2D 算是小眾軟體,有些功能還是要自己去實作。要使用 Solar2D 前,最好先大略地把 API 文件和市集逛逛,確認符合自己的需求。

Solar2D 相對不足之處

不過,Solar2D 並不是完美的,有一些相對不足的地方:

  • UI 元件 (widgets) 較少
  • 不支援 3D 動畫
  • 封閉原始碼 (closed source)
  • 學習資源相對少

Solar2D 主打的項目是 2D 遊戲,在應用程式 (business apps) 上可用的 UI widgets 相對較少。因為在電腦遊戲中,UI 的部分通常也是手刻,所以這件事不會是問題;但若想用 Solar2D 開發應用程式,現有的 UI 元件相對顯得單薄了些。其實還是可以手刻 UI,但麻煩一些。由於 Solar2D 主打 2D 遊戲,想做 3D 遊戲的話左轉去看看 Unity,就不要在這浪費時間了。

Corona 原先沒有將其開發工具的原始碼公開,後來以 GPLv3 + 商業授權雙授權的模式營運。如果不在意公開遊戲的程式碼,可以直接下載 Corona 的原始碼後,自行編譯遊戲;直接使用 Corona 的原始碼代表可以自行將登入過程畫面 (splash screen) 的廣告去除,但是要公開遊戲程式的原始碼。

原本的免費 + 付費外掛的商業模式仍然有效,如果要保護遊戲程式原始碼的開發者,就可使用這類模式。Corona 開放原始碼後,臭蟲 (bug) 修復的迭代會更快速;此外,我們可以合法地研究 Corona 背後運作的方式,不需透過逆向工程。

現在 Solar2D 以對開發者更友善的 MIT 授權來發佈,基本上就是完全免費使用。由於 Solar2D 現在已經變成由獨立開發者所維護的開發工具,如果有把 Solar2D 用在真正世界的專案上,不妨贊助一下該計畫,讓 Solar2D 永續發展。

雖然 Solar2D 本身算是不錯的產品,但是相對小眾,學習資源比較少。而且已經過了話題性 (hype),最近的新書很少。不過,Solar2D 的 API 變動不大,之前的資料多多少少還是可以參考一下。

關於作者

身為資訊領域碩士,美思認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

美思喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,美思將所學寫成文章,放在這個網站上和大家分享。