【HarmonyOS Next】鴻蒙中App、HAP、HAR、HSP概念詳解
(圖1-1)
一、鴻蒙中App、HAP、HAR、HSP是什么?
(1)App Pack(Application Package) 是應用發布的形態,上架應用市場是以App Pack形式上架。以 .app 后綴的文件,只能上架到應用市場,不能在設備上直接安裝和運行。
(2)HAP(Harmony Ability Package) 是應用安裝和運行的基本形態。
HAP的兩種類型:
其主要分為兩種類型:entry和feature:
1.entry 是應用的主模塊,作為應用的入口,提供應用的基礎功能,一個 App 中對于同一設備類型必須有且只有一個 entry 類型的 HAP,可獨立安裝運行。
2.feature 是應用的動態特性模塊,作為應用能力的擴展,可以根據用戶的需求和設備類型進行選擇性安裝,一個 App 可以包含一個或多個 feature 類型的 HAP,也可以不含。
模塊配置:
在feature模塊的module.json5配置中,ype有entry和feature兩種值,設置為后者feature,就是feature模塊。
并且deliveryWithInstall設置為false,為按需下載,用戶需通過應用內引導或應用市場手動獲取。
{"module": {"name": "application","type": "feature","description": "$string:module_desc","mainElement": "ApplicationAbility","deviceTypes": ["phone"],"deliveryWithInstall": false,"installationFree": false,"pages": "$profile:main_pages","abilities": [{"name": "ApplicationAbility","srcEntry": "./ets/applicationability/ApplicationAbility.ets","description": "$string:ApplicationAbility_desc","icon": "$media:layered_image","label": "$string:ApplicationAbility_label","startWindowIcon": "$media:startIcon","startWindowBackground": "$color:start_window_background","exported": true}]}
}
如上圖(1-1)所示,feature模塊主要是為了動態功能擴展,按需加載優化,跨設備適配三種效果。
例如,京東APP的直播模塊,就可以設計為feature,用戶點擊直播入口才去加載,減小初始包大小。并且京東APP在車機和手表等不同設備上,可以適配硬件加載不同的feature模塊。
不過需要注意的是,使用feature模塊,需處理 Feature HAP 的加載時機、依賴關系及錯誤處理,避免因模塊未下載導致功能不可用。(如首次使用時的網絡請求和安裝時間)。
feature HAP 是實現輕量化、動態化、跨設備應用的核心機制。一般是面試題目,要好好記住。
(3)HAR(Harmony Archive) 是靜態共享包。說人話,HAR可以理解為SDK依賴,與HSP的區別在加載機制上。
多包(HAP/HSP)引用相同的HAR時,會造成多包間代碼和資源的重復拷貝,從而導致應用包膨大。不過HAR 打包時全部打進引用方的 HSP/HAP 包中,可以節省安裝和加載成本。
**那為什么還需要HAR呢?**是因為加載效率高,HAR在編譯時就被打包到依賴它的每個 HAP 中,在應用啟動時就已經隨 HAP 存在于內存中,后續使用時無需額外加載步驟 ,直接調用即可;而 HSP 是動態共享包,運行時復用,在運行時按需加載,每次使用時都需要額外的查找、加載和初始化等操作,這些操作會消耗一定時間,導致加載效率降低。
并且如果我的HAR包并不會在很多HAP中引用,那做成HAR包的加載效率是比做成HSP包高很多。
(4)HSP(Harmony Shared Package) 是動態共享包,分為應用內HSP和集成態HSP。
詳細區別,參加文檔
【HarmonyOS Next】 鴻蒙應用useNormalizedOHMUrl詳解
跳轉到HSP模塊中的一個頁面,如何實現:
因為HSP中不能創建 UIAbility,那主模塊entry下跳轉到HSP模塊中的頁面需求實現如下:
import { router } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';
struct Index { message: string = '跳轉到HSP頁面'; build() { Row() { Column() { Button() { Text(this.message) .fontSize(24) } .onClick(() => { // '@bundle:包名(bundleName)/模塊名(moduleName)/路徑/頁面所在的文件名(不加.ets后綴)'router.pushUrl({ url: '@bundle:com.example.gotohsppage/library/ets/pages/Index' }).then(() => { console.info("Go to hSP page success."); }).catch((err: BusinessError) => { console.error(`Go to hSP page failed, code is ${err.code}, message is ${err.message}.`); }) }) .width(200) } .width('100%') } .height('100%') }
}
(5)總結
綜上所述,HAR 是靜態共享包,HSP 是動態共享包,它們和 HAP(應用的基本功能模塊)一起被打包成 App Pack(應用發布形態)用于應用的發布與分發。
二、鴻蒙中App、HAP、HAR、HSP的關系
三、如何創建App、HAP、HAR、HSP
App
Build - Build Hap/APP - Build APP
HAP:
1、在工程目錄上單擊右鍵,選擇New > Module。
2、在彈出的對話框中選擇Empty Ability模板,點擊Next
3、在New Project Module對話框中,進行feature模塊類型的選擇,配置name,type即可
HAR和HSP:
1、鼠標移到工程目錄頂部,單擊右鍵,選擇New > Module,在工程中添加模塊。
2、在Choose Your Ability Template界面中,選擇Static Library即為HAR,選擇Shared Library即為HSP。