★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公眾號:山青詠芝(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支援的規格對比如下,其中“√”表示是,“×”表示否。
開發者可以根據實際場景所需的能力,選擇相應型別的包進行開發。在後續的章節中還會針對如何使用HAP、HAR、HSP分別展開詳細介紹。
規格 | HAP | HAR | HSP |
---|---|---|---|
支援在配置檔案中宣告UIAbility元件與ExtensionAbility元件 | √ | × | × |
支援在配置檔案中宣告pages頁面 | √ | × | √ |
支援包含資原始檔與.so檔案 | √ | √ | √ |
支援依賴其他HAR檔案 | √ | √ | √ |
支援依賴其他HSP檔案 | √ | √ | √ |
支援在裝置上獨立安裝執行 | √ | × | × |
- HAR雖然不支援在配置檔案中宣告pages頁面,但是可以包含pages頁面,並透過命名路由的方式進行跳轉。
- 由於HSP僅支援應用內共享,如果HAR依賴了HSP,則該HAR檔案僅支援應用內共享,不支援釋出到二方倉或三方倉供其他應用使用,否則會導致編譯失敗。
- HAR和HSP均不支援迴圈依賴,也不支援依賴傳遞。