HarmonyOS:應用程式包結構(1)Stage模型應用程式包結構

为敢技术發表於2024-10-21

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公眾號:山青詠芝(MaoistLearning)
➤部落格園地址:為敢技術(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen
➤原文地址:https://www.cnblogs.com/strengthen/p/18491455
➤如果連結不是為敢技術的部落格園地址,則可能是爬取作者的文章。
➤原文已修改更新!強烈建議點選原文地址閱讀!支援作者!支援原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

為了讓開發者能對應用程式包在不同階段的形態有更加清晰的認知,分別對開發態、編譯態、釋出態的應用程式結構展開介紹。

開發態包結構

在DevEco Studio上建立一個專案工程,並嘗試建立多個不同型別的Module。根據實際工程中的目錄對照本章節進行學習,可以有助於理解開發態的應用程式結構。

圖1 專案工程結構示意圖(以實際為準)

工程結構主要包含的檔案型別及用途如下:

說明
  • AppScope目錄由DevEco Studio自動生成,不可更改。
  • Module目錄名稱可以由DevEco Studio自動生成(比如entry、library等),也可以自定義。為了便於說明,下表中統一採用Module_name表示。
檔案型別說明
配置檔案

包括應用級配置資訊、以及Module級配置資訊:

- AppScope > app.json5:app.json5配置檔案,用於宣告應用的全域性配置資訊,比如應用Bundle名稱、應用名稱、應用圖示、應用版本號等。

- Module_name > src > main > module.json5:module.json5配置檔案,用於宣告Module基本資訊、支援的裝置型別、所含的元件資訊、執行所需申請的許可權等。

ArkTS原始碼檔案 Module_name > src > main > ets:用於存放Module的ArkTS原始碼檔案(.ets檔案)。
資原始檔

包括應用級資原始檔、以及Module級資原始檔,支援圖形、多媒體、字串、佈局檔案等,詳見資源分類與訪問

- AppScope > resources :用於存放應用需要用到的資原始檔。

- Module_name > src > main > resources :用於存放該Module需要用到的資原始檔。

其他配置檔案

用於編譯構建,包括構建配置檔案、編譯構建任務指令碼、混淆規則檔案、依賴的共享包資訊等。

- build-profile.json5:工程級或Module級的構建配置檔案,包括應用簽名、產品配置等。

- hvigorfile.ts:應用級或Module級的編譯構建任務指令碼,開發者可以自定義編譯構建工具版本、控制構建行為的配置引數。

- obfuscation-rules.txt:混淆規則檔案。混淆開啟後,在使用Release模式進行編譯時,會對程式碼進行編譯、混淆及壓縮處理,保護程式碼資產。

- oh-package.json5:用於存放依賴庫的資訊,包括所依賴的三方庫和共享包。

編譯態包結構

不同型別的Module編譯後會生成對應的HAP、HAR、HSP等檔案,開發態檢視與編譯態檢視的對照關係如下:

圖2 開發態與編譯態的工程結構檢視

從開發態到編譯態,Module中的檔案會發生如下變更:

  • ets目錄:ArkTS原始碼編譯生成.abc檔案。
  • resources目錄:AppScope目錄下的資原始檔會合入到Module下面資源目錄中,如果兩個目錄下存在重名檔案,編譯打包後只會保留AppScope目錄下的資原始檔。
  • module配置檔案:AppScope目錄下的app.json5檔案欄位會合入到Module下面的module.json5檔案之中,編譯後生成HAP或HSP最終的module.json檔案。
說明

在編譯HAP和HSP時,會把他們所依賴的HAR直接編譯到HAP和HSP中。

釋出態包結構

每個應用中至少包含一個.hap檔案,可能包含若干個.hsp檔案、也可能不含,一個應用中的所有.hap與.hsp檔案合在一起稱為Bundle,其對應的bundleName是應用的唯一標識(詳見app.json5配置檔案中的bundleName標籤)。

當應用釋出上架到應用市場時,需要將Bundle打包為一個.app字尾的檔案用於上架,這個.app檔案稱為App Pack(Application Package),與此同時,DevEco Studio工具自動會生成一個pack.info檔案。pack.info檔案描述了App Pack中每個HAP和HSP的屬性,包含APP中的bundleName和versionCode資訊、以及Module中的name、type和abilities等資訊。

說明
  • App Pack是釋出上架到應用市場的基本單元,但是不能在裝置上直接安裝和執行。
  • 在應用簽名、雲端分發、端側安裝時,都是以HAP/HSP為單位進行簽名、分發和安裝的。

圖3 編譯釋出與上架部署流程圖

選擇合適的包型別

HAP、HAR、HSP三者的功能和使用場景總結對比如下:

Module型別包型別說明
Ability HAP 應用的功能模組,可以獨立安裝和執行,必須包含一個entry型別的HAP,可選包含一個或多個feature型別的HAP。
Static Library HAR

靜態共享包,編譯態複用。

- 支援應用內共享,也可以釋出後供其他應用使用。

- 作為二方庫,釋出到OHPM私倉,供公司內部其他應用使用。

- 作為三方庫,釋出到OHPM中心倉,供其他應用使用。

- 多包(HAP/HSP)引用相同的HAR時,會造成多包間程式碼和資源的重複複製,從而導致應用包膨大。

- 注意:編譯HAR時,建議開啟混淆能力,保護程式碼資產。

Shared Library HSP

動態共享包,執行時複用。

- 當前僅支援應用內共享。

- 當多包(HAP/HSP)同時引用同一個共享包時,採用HSP替代HAR,可以避免HAR造成的多包間程式碼和資源的重複複製,從而減小應用包大小。

HAP、HSP、HAR支援的規格對比如下,其中“√”表示是,“×”表示否。

開發者可以根據實際場景所需的能力,選擇相應型別的包進行開發。在後續的章節中還會針對如何使用HAPHARHSP分別展開詳細介紹。

規格HAPHARHSP
支援在配置檔案中宣告UIAbility元件與ExtensionAbility元件 × ×
支援在配置檔案中宣告pages頁面 ×
支援包含資原始檔與.so檔案
支援依賴其他HAR檔案
支援依賴其他HSP檔案
支援在裝置上獨立安裝執行 × ×
說明
  • HAR雖然不支援在配置檔案中宣告pages頁面,但是可以包含pages頁面,並透過命名路由的方式進行跳轉。
  • 由於HSP僅支援應用內共享,如果HAR依賴了HSP,則該HAR檔案僅支援應用內共享,不支援釋出到二方倉或三方倉供其他應用使用,否則會導致編譯失敗。
  • HAR和HSP均不支援迴圈依賴,也不支援依賴傳遞。

相關文章