鴻蒙 Stege模型 多模塊應用

模塊

一個鴻蒙應用可能包含一個或者多個功能模塊,在 DevEcoStudio 工程中可以創建對應的一個或多個 Module。Module 又分為 “Ability” 和 “Library”兩種類型,“Ability”類型的 Module 對應于編譯后的 HAP(Harmony Ability Package);“Library” 類型的 Module 對應于 HAR (Harmony Archive),或者 HSP (Harmony Shared Package)

三類模塊

HAP (Harmony Ability Package)HAR (Harmony Archive)HSP (Harmony Shared Package)
功能說明及適用場合分為 entryfeature;應用的功能模塊,可以獨立安裝和運行靜態共享包,編譯態復用。- 多包(HAP/HSP)引用相同的 HAR 時,會造成多包間代碼和資源的重復拷貝,從而導致應用包膨大動態共享包,運行時復用。- 當多包(HAP/HSP)同時引用同一個共享包時,可以避免 HAR 造成的多包間代碼和資源的重復拷貝,從而減少小應用包大小
支持在配置文件中聲明 UIAbility 組件與 ExtensionAbility 組件???
支持在配置文件中聲明 pages 頁面???
支持包含資源文件與.so 文件???
支持依賴其他 HAR 文件???
支持依賴其他 HSP 文件???
支持在設備上獨立安裝運行???

HAP

HAP(Harmony Ability Package)是應用安裝和運行的基本單元。HAP 包是由代碼、資源、第三方庫、配置文件等打包生成的模塊包;主要分為兩種類型:entry 和 feature:

  1. entry:應用的主模塊,作為應用的入口,提供了應用的基礎功能;
  2. feature:應用的動態特性模塊,作為應用能力的擴展,可以根據用戶的需求和設備類型進行選擇性安裝;

應用程序包可以只包含一個基礎的 entry 包,也可以包含一個基礎的 entry 包和多個功能性的 feature 包

//module.json5
{"module": {"name": "video","type": "entry","mainElement": "VideoAbility"}
}
//module.json5
{"module": {"name": "mall","type": "feature","mainElement": "MallAbility"}
}

注意:不支持導出 HAP 中的接口和 ArkUI 組件,供其他 HAR/HSP 模塊使用!!

HSP

HSP(Harmony Shared Package)是動態共享包,可以包含代碼、C++庫、資源和配置文件,通過 HSP 可以實現代碼和資源的共享。HSP 不支持獨立發布,而是跟隨其宿主應用的 APP 包一起發布,與宿主應用同進程,具有相同的包名和生命周期。主要使用場景:

  1. 多 HAP 或者 HSP 共用的代碼、資源可以使用 HSP,提高代碼的可重用性和可維護性;
  2. 按需加載,HSP 包在運行時再按需加載;
  3. 元服務分包及預加載;
//module.json5
{"module": {"name": "mylib01","type": "shared","deviceTypes": ["phone", "tablet"],"deliveryWithInstall": true,"pages": "$profile:main_pages"}
}

HAR

HAR(Harmony Archive)是靜態共享包,可以包含代碼、C++庫、資源和配置文件。通過 HAR 可以實現多個模塊或多個工程共享 ArkUI 組件、資源等相關代碼。使用場景:

  1. 導出公共 ArkUI 組件或 ts 類/方法供當前應用的其它 HAP 和 HSP 使用;
  2. 作為二方庫,發布到 OHPM 私倉,供公司內部其他應用使用;
  3. 作為三方庫,發布到 OHPM 中心倉,供其他應用使用;
//module.json5
{"module": {"name": "mylib02","type": "har","deviceTypes": ["default", "tablet"]}
}

注意:HAR 模塊默認不提供 pages,也沒有 UIAbility

HAP 模塊跳轉

模塊內跳轉

在同一個 HAP 中的多個 Page 間跳轉:多個頁面共用同一個窗口

//模塊內多個頁面間跳轉
router.pushUrl({url: "pages/Details",
});

在同一個 HAP 中的多個 UIAbility 間跳轉:每個頁面都有獨立的窗口

//模塊內多個UIAbility間跳轉
const want: Want = {deviceId: "", //可選,傳空表示本設備bundleName: "cn.baidu.myapp", //必需,應用唯一標識moduleName: "entry", //可選,模塊名稱abilityName: "ChatAbility", //必需,UIAbility名稱
};
let ctx = getContext(this) as common UIAbilityContext
ctx.startAbility(want)
跨 HAP 模塊跳轉

每個 HAP 上架到應用商店都是可以根據客戶端設備情況獨立安裝的,如果希望跳轉到其它模塊,必須在當前模塊的編譯配置中聲明“多 Hap 同時部署(Deploy Multi Hap)”

//跨多個HAP模塊跳轉
let want: Want = {deviceId: "", //傳空表示本設備bundleName: "cn.baidu.myapp", //應用唯一標識moduleName: "mall", // *******模塊名稱*********abilityName: "MallAbility", //UIAbility名稱
};let ctx = getContext(this) as common.UIAbilityContext;
ctx.startAbility(want);

跨模塊的多個頁面也都有各自的運行時窗口

使用 HSP

導出公共頁面

HSP 模塊中可以創建公共頁面,并導出,從而供多個 HAP 來使用

//mylib01/src/main/ets/pages/Login.ets
@Entry
@Component
export struct Login {build() {Row() {Column() {Text('Library Page')}.width('100%')}.height('100%')}
}
//entry/src/main/ets/pages/Index.ets
router.pushUrl({url: "@bundle:cn.baidu.myapp/mylib01/ets/pages/Login",
});

URL 格式為:
@bundle:包名/模塊名/路徑/頁面所在的文件名(不加.ets 后綴)
且“路徑”中沒有 src/main (部署態不存在這兩個目錄)!

注意
必須在 HAP 模塊的編譯配置中聲明“多 Hap 同時部署(Deploy Multi Hap)”,其中勾選 HSP 模塊

說明:HSP 模塊中是沒有 UIAbility 的!只能運行在 HAP 提供的窗口中

導出公共組件

HSP 模塊中可以創建公共組件,并導出,從而供多個 HAP 來使用

//mylib01/src/main/ets/components/TitleBar.ets
@Preview
@Component
export struct TitleBar {build() {Row() {Text('Title Bar')}.width('100%').height(45)}
}
//mylib01/Index.ets
export { TitleBar } from "./src/main/ets/components/TitleBar";
//entry/oh-package.json5
{"dependencies": {"mylib01": "file:../mylib01"}
}
//entry/src/main/ets/pages/Index.ets
import { TitleBar } from 'mylib01'@Entry
@Component
struct Index {build() {Column() {TitleBar()}}
}
導出公共對象和方法

HSP 模塊中可以創建公共對象和方法,并導出,從而供多個 HAP 來使用

//mylib01/src/main/ets/util/Calc.ets
export function add(a: number, b: number) {return a + b;
}export function sub(a: number, b: number) {return a - b;
}
//mylib01/Index.ets
export { add, sub } from "./src/main/ets/utils/Calc";
//entry/oh-package.json5
{"dependencies": {"mylib01": "file:../mylib01"}
}
//entry/src/main/ets/pages/Index.ets
import { add } from 'mylib01'build() {Column() {Button('相加').onClick(_ => {add(10, 20)})}
}

使用 HAR

導出 pages 頁面

HAR 不支持在配置文件中聲明 pages 頁面,但是可以包含 pages 頁面,并通過命名路由的方式進行跳轉

//mylib02/src/main/ets/pages/MyPage.ets
@Entry({ routeName: 'myPage' })
@Component
export struct MyPage {build() {Row() {Text('My Page')}.width('100%').height('100%')}
}
//mylib02/Index.ets
//命名路由頁面無需導出
//entry/oh-package.json5
{"dependencies": {"mylib02": "file:../mylib02"}
}
//entry/src/main/ets/pages/Index.ets
import('mylib02/src/main/ets/pages/MyPage')@Entry
@Component
struct Index {build() {Button('跳轉到HAR中的頁面').onClick(_ => {router.pushNamedRoute({name: 'myPage', //頁面名稱params: {}      //自定義的路由參數})})}
}
導出公共組件

HAR 模塊中可以創建公共組件,并導出,從而供多個 HAP 來使用

//mylib02/src/main/ets/components/TitleBar.ets
@Preview
@Component
export struct TitleBar {build() {Row() {Text('Title Bar')}.width('100%').height(45)}
}
//mylib02/Index.ets
export { TitleBar } from "./src/main/ets/components/TitleBar";
//entry/oh-package.json5
{"dependencies": {"mylib02": "file:../mylib02"}
}
//entry/src/main/ets/pages/Index.ets
import { TitleBar } from 'mylib02'@Entry
@Component
struct Index {build() {Column() {TitleBar()}}
}
導出公共對象和方法

HAR 模塊中可以創建公共對象和方法,并導出,從而供多個 HAP 來使用

//mylib02/src/main/ets/util/Calc.ets
export function add(a: number, b: number) {return a + b;
}export function sub(a: number, b: number) {return a - b;
}
//mylib02/Index.ets
export { add, sub } from "./src/main/ets/utils/Calc";
//entry/oh-package.json5
{"dependencies": {"mylib02": "file:../mylib02"}
}
//entry/src/main/ets/pages/Index.ets
import { add } from 'mylib02'build() {Column() {Button('相加').onClick(_ => {add(10, 20)})}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908806.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908806.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908806.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

領域LLM九講——第4講 構建可測評、可優化的端到端商業AI Agent 系統

領域LLM九講——第4講 構建可測評、可優化的端到端商業AI Agent 系統 以 OpenAI Cookbook 的《receipt_inspection》示例為基礎,探討如何設計一個可測試、可優化的端到端 AI Agent 系統。整體流程分為三個階段: (1) 端到端 Agent 構建(基線測…

MySQL體系架構解析(三):MySQL目錄與啟動配置全解析

MySQL中的目錄和文件 bin目錄 在 MySQL 的安裝目錄下有一個特別重要的 bin 目錄,這個目錄下存放著許多可執行文件。與其他系統的可執行文件類似,這些可執行文件都是與服務器和客戶端程序相關的。 啟動MySQL服務器程序 在 UNIX 系統中,用…

Linux線程與進程關系及底層實現

在操作系統中,線程切換相比進程切換更輕量級的關鍵原因之一是 緩存(Cache)的有效性,尤其是對 CPU 緩存(如 L1/L2/L3)和 TLB(Translation Lookaside Buffer)的影響。以下從緩存角度詳…

【論文閱讀30】Bi-LSTM(2024)

用于精確實時滑坡檢測的雙向LSTM模型:以印度梅加拉亞邦毛永格里姆為例的研究 IEEE Internet of Things Journal(簡稱 IoT?J)是一份 IEEE 自 2014 年起雙月刊發表的國際頂級學術期刊,專注于物聯網各領域的研究。 作者&#xff1a…

Java編程之原型模式

原型模式的定義 原型模式(Prototype Pattern)是一種創建型設計模式,通過復制已有對象來創建新對象,而非通過常規的手段的new關鍵字來實例化。適用于對象創建成本較高或需要動態配置的場景。 例如,在一個游戲開發中&am…

RAG質量評估

當完成了一個RAG系統的開發工作以后,還需要對該系統的性能進行評估。如何對RAG系統的性能進行評估呢?仔細分析RAG系統的產出成果,主要涉及以下幾點: (1)檢索器組件 檢索的相關文檔 context, (…

LLMs基礎學習(八)強化學習專題(1)

LLMs基礎學習(八)強化學習專題(1) 文章目錄 LLMs基礎學習(八)強化學習專題(1)學習資料資源強化學習是什么強化學習一句話精準定義 強化學習與其他學習類型的對比強化學習 vs 監督學習…

19-Oracle 23 ai Database Sharding-知識準備

小伙伴是不是經常遇見大規模集群和數量的時候,業務就提出要對數據進行sharding。 Oracle 和其他數據庫(如 MySQL、PostgreSQL、MongoDB 等) 為什么要進行分片(sharding),分片的原因是什么,實現…

分類與邏輯回歸 - 一個完整的guide

線性回歸和邏輯回歸其實比你想象的更相似 😃 它們都是所謂的參數模型。讓我們先看看什么是參數模型,以及它們與非參數模型的區別。 線性回歸 vs 邏輯回歸 線性回歸:用于回歸問題的線性參數模型。邏輯回歸:用于分類問題的線性參數…

英語寫作中“每一個”each individual、every individual、every single的用法

一、Individual :個體,相對于團體,例如: Individual competition (個人比賽),相對于team competition (團體比賽) Individual users (個人用戶)…

由于 z(x,y) 的變化導致的影響(那部分被分給了鏈式項)

? 本質問題:為什么鏈式法則中 ? F ? x \frac{\partial F}{\partial x} ?x?F? 不考慮 z z ( x , y ) zz(x,y) zz(x,y)? 🔍 一、關鍵是:偏導數的定義是什么? 我們從最根本的定義開始: ? F ( x , y…

python打卡day44@浙大疏錦行

知識點回顧: 預訓練的概念常見的分類預訓練模型圖像預訓練模型的發展史預訓練的策略預訓練代碼實戰:resnet18 作業: 嘗試在cifar10對比如下其他的預訓練模型,觀察差異,盡可能和他人選擇的不同嘗試通過ctrl進入resnet的…

十一(3) 類,加深對拷貝構造函數的理解

class ClassName { public: // 拷貝構造函數:參數是同類型對象的引用(通常為 const 引用) ClassName(const ClassName& other) { // 復制 other 的成員變量到當前對象 } }; 參數要求:必須是同類型對象的引用&#xff0…

網頁后端開發(基礎1--maven)

maven的作用: Maven是一款管理和構建Java項目的工具。 1.依賴管理: 方便快捷的管理項目依賴的資源(jar包) 不用手動下載jar包,只需要中maven中引用,maven會查找本地倉庫。若本地倉庫沒有,會直…

認識電子元器件---高低邊驅動

目錄 一、基本概念 二、關鍵參數對比 三、工作原理 (1)高邊驅動 (2)低邊驅動 四、典型的應用場景 五、如何選擇 一、基本概念 可以理解成:高低邊驅動是MOS/IGBT的一種應用方式 高低邊驅動是電路拓撲概念&#…

JavaScript 標簽加載

目錄 JavaScript 標簽加載script 標簽的 async 和 defer 屬性,分別代表什么,有什么區別1. 普通 script 標簽2. async 屬性3. defer 屬性4. type"module"5. 各種加載方式的對比6. 使用建議 JavaScript 標簽加載 script 標簽的 async 和 defer …

C/CPP 結構體、聯合體、位段內存計算 指南

C/CPP 結構體、聯合體、位段內存計算 指南 在C語言中,結構體、聯合體和位段是對數據的高級抽象,它們可以讓程序員以更易于理解的方式來操作復雜的數據結構。然而,這些結構在內存中的布局可能并不如它們的語法結構那樣直觀,特別是當…

ASR(語音識別)語音/字幕標注 通過via(via_subtitle_annotator)

文章目錄 1 VIA 官網資料2 語音/字幕標注3 鍵盤快捷鍵常規當一個時間片段被選中時圖像或視頻幀中的空間區域 1 VIA 官網資料 VIA官網:https://www.robots.ox.ac.uk/~vgg/software/via/ VIA官網標注示例:https://www.robots.ox.ac.uk/~vgg/software/via/…

mq安裝新版-3.13.7的安裝

一、下載包,上傳到服務器 https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.13.7/rabbitmq-server-generic-unix-3.13.7.tar.xz 二、 erlang直接安裝 rpm -ivh erlang-26.2.4-1.el8.x86_64.rpm不需要配置環境變量,直接就安裝了。 erl…

高通平臺PCIE EP模式log丟失問題

高通平臺PCIE EP模式log丟失問題 1 問題背景2 問題分析2.1 對比USB2.1.1 Logtool優化2.1.2 Device mhi與fs對比2.2 優化方案2.2.1 Diag系統優化2.2.2 Host mhi優化3 最終成果1 問題背景 高通5G模組如SDX55\SDX62\SDX65\SDX72\SDX75等支持pcie ep模式。會通過pcie與host(如MT7…