引言
在前面的系列文章中,我們從搭建開發環境開始,講到如何使用、集成第三方插件,如何將現有項目進行鴻蒙化改造,以及上架審核等內容;還以高德地圖的 HarmonyOS SDK 的使用為例,
講解了如何將高德地圖集成至項目當中。
混合開發
除了使用 Flutter 工程做為主項目開發以外,還有一種常見的開發方式,即混合開發,主項目工程為 HarmonyOS 工程, Flutter 工程以模塊形式存在,,以依賴方式加載到主項目工程中,最終實現混合開發 。
想必混合開發也不會陌生,因為我們也簡要介紹過,鴻蒙 Flutter 項目混合開發的兩種形式。
從本章開始,我們將進一步深入,從原理出發、以工程實戰為主線,探索這兩種混合開發方式。
混合開發的兩種方式
- 以 Har 包的方式加載到 HarmonyOS 工程
HAR(Harmony Archive)是靜態共享包,可以包含代碼、C++庫、資源和配置文件。通過HAR可以實現多個模塊或多個工程共享ArkUI組件、資源等相關代碼。
這種開發方式,就是將 Flutter 模塊編譯打包成 HAR 包,在原生鴻蒙項目中,以 Har 包的方式引入這個模塊包,從而實現混合開發。
- 以源碼的方式加載到 HarmonyOS 工程
從方式 1 的介紹中,可以發現,每次 Flutter 模塊的更新都需要重新編譯成 Har 包,并且需要重新打包到原生鴻蒙工程中,非常麻煩。于是就有了源碼依賴的方式,也就是說,
讓原生鴻蒙工程依賴 Flutter 模塊的源碼,這樣 Flutter 代碼變更時,不需要重新打包成 Har 包,而且可以在開發過程中,實現熱更新,實時刷新界面。
開發流程
- 總目錄
為了方便管理/演示,本示例的目錄名為 ohos_flutter_module_demo, 我們將原生鴻蒙工程和 Flutter 模塊都在這個目錄下創建。
- 創建原生鴻蒙工程
這個也就是宿主工程,這里我們使用 DevEco Studio,在 ohos_flutter_module_demo 目錄下面, 創建一個原生鴻蒙工程,本文中工程名命名為 ohos_app。
- 創建 Flutter 模塊
這個流程都一樣,我們可以使用命令以下命令創建一個 Flutter 模塊:
flutter create --template=module my_flutter_module
最終項目目錄結構如下:
ohos_flutter_module_demo
├── my_flutter_module
├── ohos_app
這樣,為了方便維護,Flutter 模塊在宿主項目外部創建,與宿主項目同級目錄。本文中,上級目錄為 ohos_flutter_module_demo, 其下有兩個子目錄,分別是 ohos_app (宿主項目),和 my_flutter_module (Flutter 模塊)。
- 編譯 Flutter 模塊
如何使用 Har 包模式,需要先將 Flutter 模塊編譯成 Har 包;如何使用源碼依賴的方式,則不需要這一步。
使用以下命令將 Flutter 模塊編譯成 Har 包:
flutter build har --debug
- 配置原生鴻蒙工程
如果是通過 Har 包模式,則可將 Har 包添加至依賴文件中:
首先先構建出的 Har 包復制到 ohos 鴻蒙工程中:
cp -r my_flutter_module/.ohos/har/* ohos_app/har/
"dependencies": {"@ohos/flutter_module": "file:har/flutter_module.har","@ohos/flutter_ohos": "file:har/flutter.har"},"overrides" {"@ohos/flutter_ohos": "file:har/flutter.har",}
如果是通過源碼模式,則需將 Flutter 模塊的源碼添加至依賴文件中:
"dependencies": {"@ohos/flutter_module": "../flutter_module"}
- 修改入口文件(可選)
修改入口文件, 將 Flutter 模塊生成的 .ohos目錄中的 EntryAbility.ets 和 Index.ets 文件復制到宿主工程中進行替換
cp my_flutter_module/.ohos/entry/src/main/ets/entryability/EntryAbility.ets ohos_app/entry/src/main/ets/entryability/EntryAbility.ets
cp my_flutter_module/.ohos/entry/src/main/ets/pages/Index.ets ohos_app/entry/src/main/ets/pages/Index.ets