🥦 鸿蒙学习实战之路-HarmonyOS包转换全攻略

最近好多朋友问我:“西兰花,我写了个HarmonyOS组件库,怎么打包成HAR给别人用?”“我有个HSP想转成HAR,能行吗?”"HAP怎么导出成可复用的HAR?"o(╯□╰)o

别慌别慌!今天这篇,我就把鸿蒙开发中常用的三种包转换(HAR转HSP、HSP转HAR、HAP转HAR)一次性讲明白,全程带代码、带步骤,包你看完就会!

🥦 一、先搞清楚:什么是HAR、HSP、HAP?

在开始转换之前,咱们得先弄明白这三个"包"到底是啥:

包类型 全称 作用 类比
HAR Harmony Archive 静态共享包,用于代码复用 就像厨房里的"预制菜",可以直接拿来用
HSP Harmony Shared Package 动态共享包,运行时加载 类似"外卖",需要的时候才送过来
HAP Harmony Ability Package 应用安装包,可直接运行 完整的"一顿饭",可以直接吃

简单来说:

  • HAR适合组件库、工具类的复用,编译时集成
  • HSP适合需要动态更新的功能模块,运行时加载
  • HAP就是最终用户安装的应用

🥦 二、HAR转HSP:静态包变动态包

有时候咱们写了个HAR组件库,但想让它支持动态更新,这时候就需要把HAR转成HSP了。

1. 操作步骤

步骤1:创建HSP模块
在DevEco Studio中,右键点击项目 > New > Module > HarmonyOS Shared Package (HSP)

步骤2:配置HSP的build-profile.json5

{
  "app": {
    "signingConfigs": [],
    "compileSdkVersion": 9,
    "compatibleSdkVersion": 9
  },
  "modules": [
    {
      "name": "my_hsp",
      "srcPath": "./my_hsp",
      "targets": [
        {
          "name": "default",
          "applyToProducts": ["default"]
        }
      ],
      "buildOption": {
        "arkOptions": {
          "runtimeOnly": {
            "jsiLibs": []
          }
        }
      }
    }
  ]
}

步骤3:将HAR的源码复制到HSP模块
把原来HAR里的代码、资源文件复制到HSP的对应目录下

步骤4:构建HSP
点击Build > Build Hap(s)/Hsp(s) > Build Hsp(s)

2. 代码示例

假设我们有个HAR里的按钮组件,转成HSP后这样用:

// 导入HSP里的组件
import { CustomButton } from 'hsp://my_hsp/components/CustomButton';

@Entry
@Component
struct Index {
  build() {
    Column() {
      // 使用HSP里的组件
      CustomButton({
        text: '点击我',
        onClick: () => {
          console.log('HSP组件被点击了!');
        }
      })
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }
}

🥦 三、HSP转HAR:动态包变静态包

相反,如果我们有个HSP想转成HAR,方便在其他项目中静态集成,该怎么做呢?

1. 操作步骤

步骤1:创建HAR模块
在DevEco Studio中,右键点击项目 > New > Module > HarmonyOS Archive (HAR)

步骤2:配置HAR的build-profile.json5

{
  "app": {
    "signingConfigs": [],
    "compileSdkVersion": 9,
    "compatibleSdkVersion": 9
  },
  "modules": [
    {
      "name": "my_har",
      "srcPath": "./my_har",
      "type": "har",
      "targets": [
        {
          "name": "default",
          "applyToProducts": ["default"]
        }
      ],
      "buildOption": {
        "arkOptions": {
          "runtimeOnly": {
            "jsiLibs": []
          }
        }
      }
    }
  ]
}

步骤3:将HSP的源码复制到HAR模块
注意:需要移除HSP特有的动态加载代码

步骤4:构建HAR
点击Build > Build Hap(s)/Hsp(s) > Build Har(s)

2. 代码示例

转成HAR后,组件的使用方式变成这样:

// 导入HAR里的组件(注意导入路径变化)
import { CustomButton } from '@ohos/my_har/components/CustomButton';

@Entry
@Component
struct Index {
  build() {
    Column() {
      // 使用HAR里的组件
      CustomButton({
        text: '点击我',
        onClick: () => {
          console.log('HAR组件被点击了!');
        }
      })
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }
}

🥦 四、HAP转HAR:应用变可复用组件

有时候我们在开发HAP应用时,发现某个功能模块做得特别好,想抽出来做成HAR给其他项目用,这时候就需要HAP转HAR了。

1. 操作步骤

步骤1:创建HAR模块
和前面一样,先创建一个HAR模块

步骤2:分析HAP的功能模块
找出HAP中可复用的组件、工具类等

步骤3:复制代码并处理依赖

  • 复制可复用的源码到HAR模块
  • 处理资源文件(图片、字符串等)
  • 移除应用特有的配置和代码(如MainAbility)

步骤4:配置HAR的public API
在HAR的oh-package.json5中配置需要导出的API:

{
  "name": "my_har",
  "version": "1.0.0",
  "description": "我的HAR组件库",
  "main": "index",
  "exports": {
    "./components/*": {
      "default": "./src/main/ets/components/*"
    },
    "./utils/*": {
      "default": "./src/main/ets/utils/*"
    }
  }
}

步骤5:构建HAR
点击Build > Build Hap(s)/Hsp(s) > Build Har(s)

2. 代码示例

假设我们从HAP中抽出了一个轮播图组件:

// 轮播图组件(从HAP中抽出)
@Component
export struct CarouselComponent {
  @Prop images: string[] = [];
  @Prop interval: number = 3000;

  build() {
    Carousel() {
      ForEach(this.images, (image) => {
        Image(image)
          .width('100%')
          .height(200)
          .objectFit(ImageFit.Cover)
      })
    }
    .width('100%')
    .height(200)
    .autoPlay(true)
    .interval(this.interval)
    .loop(true)
  }
}

在其他项目中使用这个HAR组件:

import { CarouselComponent } from '@ohos/my_har/components/CarouselComponent';

@Entry
@Component
struct Index {
  private images: string[] = [
    'https://example.com/image1.jpg',
    'https://example.com/image2.jpg'
  ];

  build() {
    Column() {
      Text('轮播图示例')
        .fontSize(20)
        .margin({ top: 20 })
      
      // 使用从HAP抽出的轮播图组件
      CarouselComponent({
        images: this.images,
        interval: 2000
      })
      .margin({ top: 20 })
    }
    .width('100%')
    .padding(20)
  }
}

🥦 五、三种转换的对比总结

转换类型 使用场景 优点 注意事项
HAR→HSP 需要动态更新的组件库 支持运行时更新 需处理动态加载的兼容性
HSP→HAR 动态模块转静态复用 编译时集成,性能更好 移除动态加载相关代码
HAP→HAR 应用功能模块复用 快速沉淀可复用组件 需清理应用特有代码

🥦 西兰花警告

  1. 资源文件处理:转换时要注意资源文件的路径,特别是图片、字符串等,避免资源找不到的问题

  2. API兼容性:HAR和HSP的API导出方式不同,转换后要检查导入路径是否正确

  3. 依赖管理:转换时要注意处理第三方依赖,避免重复依赖或版本冲突

  4. 签名配置:HSP需要签名配置,而HAR不需要,转换时要注意调整

🥦 西兰花小贴士

  • 如果你经常需要进行包转换,可以考虑写个脚本自动化处理
  • 转换完成后一定要进行测试,确保功能正常
  • 对于复杂的包,建议先小范围转换和测试,再推广使用

🥦 总结

今天咱们学习了HarmonyOS开发中三种常用的包转换:

  1. HAR转HSP:适合需要动态更新的组件库
  2. HSP转HAR:适合将动态模块转成静态复用
  3. HAP转HAR:适合从应用中抽出可复用的功能模块

每种转换都有其适用场景,根据实际需求选择合适的方式即可。

📚 推荐资料:

我是盐焗西兰花,
不教理论,只给你能跑的代码和避坑指南。
下期见!🥦

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐