HarmonyOS之共享包

  • 概述

    鴻蒙中有兩種共享包,HAR(Harmony Archive)靜態共享包和HSP(Harmony Shared Package)動態共享包。

    HAR與HSP都是為了實現代碼和資源的共享,都可以包含代碼、C++庫、資源和配置文件,最大的不同之處在于:HAR中的代碼和資源跟隨使用方編譯,如果有多個使用方,它們的編譯產物中會存在多份相同拷貝;而HSP中的代碼和資源可以獨立編譯,運行時在一個進程中代碼也只會存在一份。

    HAR和HSP在APP包中的形態示意圖
  • HSP

    使用IDE的SharedLibrary模板創建后,結構如下:

    HSP目錄結構

    在其中的oh-package.json5中:

    {
      "license": "Apache-2.0",
      "devDependencies": {},
      "author": "",
      "name": "my_shared_library",
      "description": "Please describe the basic information.",
      "main": "Index.ets",
      "version": "1.0.0",
      "dependencies": {}
    }
    

    有一個main屬性,在這個屬性指定的文件中export需要的組件和類(包括native類),這個文件名字隨便起,但是文件一定要放在該HSP的根目錄下(基于DevEco Studio4.0.3.700)。

    在main指定的Index.ets中:

    export { MyHsp } from './src/main/ets/pages/Index'
    

    這里export了一個組件,其中MyHsp是組件名。這樣一來,使用方就可以import它來使用了。

    它的module.json5中:

    {
      "module": {
        "name": "my_shared_library",
        "type": "shared",
        "description": "$string:shared_desc",
        "deviceTypes": [
          "phone",
          "tablet",
          "2in1"
        ],
        //標識當前Module是否在用戶主動安裝的時候安裝,表示該Module對應的HAP是否跟隨應用一起安裝。- true:主動安裝時安裝。- false:主動安裝時不安裝。
        "deliveryWithInstall": true,
        "pages": "$profile:main_pages"
      }
    }
    

    注意這里的type是shared。

  • HAR

    使用IDE的StaticLibrary模板創建后,結構如下:

    截屏2023-12-28 16.50.17.png

    和HSP一樣,它的oh-package.json5中的main屬性指定export文件,在其中配置需要export的組件和類。

    它的module.json5中:

    {
      "module": {
        "name": "har2",
        "type": "har",
        "deviceTypes": [
          "default",
          "tablet",
          "2in1"
        ]
      }
    }
    

    type是har

  • 依賴和導入

    使用HSP和HAR也很簡單,在使用方module下(一般是entry)的oh-package.json5中:

    {
      "license": "",
      //這個是用于開發過程中使用的依賴工具,不會打包到HAP中
      "devDependencies": {},
      "author": "",
      "name": "entry",
      "description": "Please describe the basic information.",
      "main": "",
      "version": "1.0.0",
      "dependencies": {
        //本地依賴的key可以是自定義,最終會在oh_modules下生成
        "my-shared-library": "file:../my_shared_library",
        "har1": "file:../har1",
        "har2": "file:../har2"
      }
    }
    

    在dependencies屬性下添加依賴項,前面的key可以自定義,value指定對應共享包module的相對路徑,然后根據IDE的提示進行ohpm的安裝,比如上面的依賴項定義好,build后會在使用方module下的oh_modules目錄下生成對應的依賴目錄:

    截屏2023-12-28 15.09.41.png

    注意,key會作為依賴項的最終導入名,下面我們來看導入。

    import {MyHsp} from 'my-shared-library'
    //如果都導入的話
    import('my-shared-library')
    
    //導入har
    import {Har1Page} from 'har1'
    

    可以看到,這里可以導入部分,也可以導入所有export的組件和類。注意看from后面的信息,這個就是前面dependencies中指定的key值,他們是一一對應的。(測試的時候需要用真機或者模擬器,previewer暫不支持共享包調用效果)

  • 命名路由

    對應module內的路由導航,我們通常使用profile指定的路由表進行,但是在module之間的路由導航時通常使用命名路由來完成。

    router.pushNamedRoute({ name: 'MyHSP' }, (err) => {
      if (err) {
        console.error(`pushNamedRoute failed, code is ${err.code}, message is ${err.message}`);
        return;
      }
      console.info('pushNamedRoute success');
    })
    

    比如在一個HSP中的Entry組件的@Entry屬性上定義一個路由名字:

    @Entry({ routeName: 'MyHSP' })
    @Component
    export struct MyHsp {
      ...
    }
    

    然后在跳轉處導入:

    import('my-shared-library')
    

    還有一種方式,即如果使用如下的導入方式的話:

    import {MyHsp} from 'my-shared-library'
    

    則MyHsp組件必須保證在組件樹中使用了,如果沒使用的話進行路由跳轉則會失敗。當然上面的導航需要依賴好共享包之后才能跳轉,在IDE的測試時需要在該處配置好依賴module,否則會報錯:

    截屏2023-12-28 15.23.38.png

    截屏2023-12-28 15.24.53.png

    其實,命名路由還可以進行同一module內的路由跳轉:

    import('./Demo1')
    

    比如這里的Demo1文件存在于調用方同一目錄下時的引入方式。但是對于同一module內的導航來說,這種方式有些畫蛇添足,因為它需要多一步手動導入的過程,不如直接使用路由表跳轉來的簡單、整潔。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容