• Lv0
    粉丝79

积分431 / 贡献0

提问31答案被采纳5文章47

[经验分享] OpenHarmony小型系统 helloworld.hap 的编译和打包 原创

润开鸿_坚果 显示全部楼层 发表于 2023-11-8 19:14:46

OpenHarmony小型系统 helloworld.hap 的编译和打包

源代码

将 helloworld.tar.gz 解压到 //applications/sample/camera/ 目录下,目录结构为:

./helloworld/
├── README.md          # 本文档
├── bundle.json_bak    # 这个文件当前配置下用不到,修改编译配置时,可以用到
├── helloworld.hap     # 手动打包出来的未签名的hap文件[loongarch64]
├── libhelloworld.so   # 编译helloworld代码时生成的动态链接库[loongarch64]
│
│   # 以下是应用程序的源代码文件
├── cert               # hap的签名文件,当前签名是无效的
│   └── com.sample.helloworld.invalid_signature.p7b
├── BUILD.gn           # 编译生成libhelloworld.so,以及将其与资源一起打包成hap的描述
└── src                # helloworld应用程序的源代码
    ├── config.json    # hap的配置信息
    ├── main
    │   ├── event_listener.h
    │   ├── main_ability.cpp
    │   ├── main_ability.h
    │   ├── main_ability_slice.cpp
    │   └── main_ability_slice.h
    └── resources      # hap的icon图标(还可以包含其他的资源)
        └── Icon_HelloWorld.png

编译配置

编辑 //applications/sample/camera/bundle.json 文件,在"sub_component"中增加一个组件:

"build": {
            "sub_component": [
                "//applications/sample/camera/helloworld:helloworld_hap",
                ......
                "//applications/sample/camera/media:media_sample"
            ],
            "inner_kits": [],
            "test": []
        }

由于 ./helloworld/BUILD.gn 中的 hap_pack("helloworld_hap") 里所引用的签名文件是无效的,

# NOTE: invalid_signature, so auto-pack hw.hap will fail
  # we need to pack hw.hap manually
  # when the cert_profile is valid, hw.hap will be packed and installed automatically
  cert_profile = "cert/com.sample.helloworld.invalid_signature.p7b"

编译时无法将生成的 libhelloworld.so 、资源文件以及签名文件进行自动打包以生成 helloworld.hap 应用,因此,需要我们手动打包出未签名的 helloworld.hap 应用。

手动打包未签名的 helloworld.hap

将编译生成的 //out/../../usr/lib/libhelloworld.so 文件,复制到 //applications/sample/camera/helloworld/目录下(如上面目录树结构中所示),同时在命令行中切换路径到该目录下,执行:

java -jar ../../../../developtools/packing_tool/jar/app_packing_tool.jar --mode hap --json-path ./src/config.json --resources-path ./src/resources --ability-so-path ./libhelloworld.so --out-path ./helloworld.hap

注意,上述命令中的各个路径要准确,否则会无法正确打包相关资源到hap中。

正常执行完上述命令后,可以在该目录下生成 helloworld.hap 文件(如上面目录树结构中所示),这是未签名的hap。

手动安装未签名的 helloworld.hap

将未签名的 helloworld.hap 文件复制到U盘(FAT32格式)根目录下,插入开发板,开发板上电运行到稳定状态之后,依次执行如下命令:

mount -t vfat /dev/sda1 /mnt            # 挂载U盘到 /mnt
mount -t vfat /dev/mmcblk1p1 /mnt
​
bm set -s disable                       # 关闭系统的签名验证功能,否则无法安装未签名的hap
bm install -p /mnt/helloworld.hap       # 安装未签名的hap
​
​
# 如果要卸载hap,执行如下命令后,重启开发板即可
bm uninstall -n com.sample.helloworld

注意事项

  1. 小型系统的可烧录镜像中,需要把 bm 工具打包进去才能使用该工具安装hap。
  2. 这个示例程序是使用C++编写的,需要部署到OpenHarmony系统中,跟随OH系统一并进行交叉编译(确保libhelloworld.so为正确的指令集架构下的二进制文件),并按上面的操作进行手动打包和手动安装。
  3. 如果使用DevEco Studio IDE选择js、ets、arkts等语言进行开发,可以直接编译、签名和打包出helloworld.hap 程序,直接用 bm 工具进行安装即可。【注意,此条目未经确认,目前OpenHarmony上的大多数应用示例程序,都是只能运行在标准系统中,因此,需要开发者自行验证该条目是否可行】
  4. DevEco Studio IDE应该也可以直接编译、签名和打包这个C++语言的app【本条目也未经确认】;应该也可以将签名文件提取出来,替换上面目录中的 com.sample.helloworld.invalid_signature.p7b 文件,并修改BUILD.gn中的对应名字,重新编译应该就可以自动生成带签名的 helloworld.hap 程序了。

©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部