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

🥦 鸿蒙学习实战之路-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

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后这样用:

arkts 复制代码
// 导入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

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后,组件的使用方式变成这样:

arkts 复制代码
// 导入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:

json5 复制代码
{
  "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中抽出了一个轮播图组件:

arkts 复制代码
// 轮播图组件(从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组件:

arkts 复制代码
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:适合从应用中抽出可复用的功能模块

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

📚 推荐资料:

我是盐焗西兰花,

不教理论,只给你能跑的代码和避坑指南。

下期见!🥦

相关推荐
FrameNotWork3 小时前
【HarmonyOS 状态管理超全解析】从 V1 到 V2,一次讲清 @State/@Observed/@Local…等所有装饰器!附超易懂示例!
华为·harmonyos
威哥爱编程3 小时前
【鸿蒙开发案例篇】基于MindSpore Lite的端侧人物图像分割案例
harmonyos·arkts·arkui
我是Feri3 小时前
HarmonyOS 6.0 ArkWeb开发实战:从基础到进阶的ArkUI+ArkTS实践
华为·harmonyos·harmonyos6.0
鸿蒙开发工程师—阿辉4 小时前
HarmonyOS 5 极致动效实验室:共享元素转场 (GeometryTransition)
华为·harmonyos
豫狮恒5 小时前
OpenHarmony Flutter 分布式软总线实战:跨设备通信的核心技术与应用
flutter·wpf·harmonyos
遇到困难睡大觉哈哈5 小时前
Harmony os —— Data Augmentation Kit 知识问答完整示例实战拆解(从 0 跑通流式 RAG)
harmonyos·鸿蒙
L、2185 小时前
Flutter 与 OpenHarmony 跨端融合新范式:基于 FFI 的高性能通信实战
flutter·华为·智能手机·electron·harmonyos
Wnq100725 小时前
鸿蒙 OS 与 CORBA+DDS+QOS+SOA 在工业控制领域的核心技术对比研究
物联网·性能优化·wpf·代理模式·信号处理·harmonyos·嵌入式实时数据库
解局易否结局5 小时前
鸿蒙UI开发中Flutter的现状与鸿蒙系统UI生态未来方向
flutter·ui·harmonyos