写点什么

[触觉智能 RK3568] 指定单个 OpenHarmony 镜像进行独立编译

作者:离北况归
  • 2023-02-28
    江苏
  • 本文字数:5086 字

    阅读完需:约 17 分钟

一、OpenHarmony master 最新分支提供支持独立编译镜像的功能

  • OpenHarmony master 最新分支提供支持独立编译镜像的功能。支持独立编译的镜像有 chip_prod.img、sys_prod.img、system.img、usedata.img、vendor.img、ramdisk.img、updater.img。

  • 例如./build.sh --product-name rk3568 --ccache --build-target system_image可以单独编译出system.img镜像

  • OpenHarmony Beta4 和 5 编译构建过程中,只可以在编译命令./build.sh --product-name rk3568 --ccache指定--build-target images或者--build-target make_images对所有镜像进行编译。无法通过指定单个镜像进行独立编译,同时单个镜像与 platform 关联,无法直接指定单个镜像的名称。


out/rk3568/packages/phone/images 下镜像文件:MiniLoaderAll.bin boot_linux.img chip_prod.img config.cfg parameter.txt ramdisk.img resource.img sys_prod.img system.img uboot.img updater.img userdata.img vendor.img

二、修改 OpenHarmonyBeta4 源码新增独立编译镜像的功能

  • 1、在 OpenHarmonyBeta4 源码 build/ohos/images/BUILD.gn 第 48 行添加如下内容


group("chip_prod_image") {  deps = []  if (is_standard_system) {    deps += [      "//third_party/e2fsprogs:e2fsprogs_host_toolchain",      "//third_party/f2fs-tools:f2fs-tools_host_toolchain",    ]  }  foreach(_platform, target_platform_list) {    deps += [ ":${_platform}_chip_prod_image" ]  }}
group("sys_prod_image") { deps = [] if (is_standard_system) { deps += [ "//third_party/e2fsprogs:e2fsprogs_host_toolchain", "//third_party/f2fs-tools:f2fs-tools_host_toolchain", ] } foreach(_platform, target_platform_list) { deps += [ ":${_platform}_sys_prod_image" ] }}
group("system_image") { deps = [] if (is_standard_system) { deps += [ "//third_party/e2fsprogs:e2fsprogs_host_toolchain", "//third_party/f2fs-tools:f2fs-tools_host_toolchain", ] } foreach(_platform, target_platform_list) { deps += [ ":${_platform}_system_image" ] }}
group("userdata_image") { deps = [] if (is_standard_system) { deps += [ "//third_party/e2fsprogs:e2fsprogs_host_toolchain", "//third_party/f2fs-tools:f2fs-tools_host_toolchain", ] } foreach(_platform, target_platform_list) { deps += [ ":${_platform}_userdata_image" ] }}
group("vendor_image") { deps = [] if (is_standard_system) { deps += [ "//third_party/e2fsprogs:e2fsprogs_host_toolchain", "//third_party/f2fs-tools:f2fs-tools_host_toolchain", ] } foreach(_platform, target_platform_list) { deps += [ ":${_platform}_vendor_image" ] }}
group("ramdisk_image") { deps = [] if (is_standard_system) { deps += [ "//third_party/e2fsprogs:e2fsprogs_host_toolchain", "//third_party/f2fs-tools:f2fs-tools_host_toolchain", ] } foreach(_platform, target_platform_list) { if (enable_ramdisk) { deps += [ ":${_platform}_ramdisk_image" ] } }}
group("updater_ramdisk_image") { deps = [] if (is_standard_system) { deps += [ "//third_party/e2fsprogs:e2fsprogs_host_toolchain", "//third_party/f2fs-tools:f2fs-tools_host_toolchain", ] } foreach(_platform, target_platform_list) { if (enable_ramdisk) { deps += [ ":${_platform}_updater_ramdisk_image" ] } }}
group("updater_image") { deps = [] if (is_standard_system) { deps += [ "//third_party/e2fsprogs:e2fsprogs_host_toolchain", "//third_party/f2fs-tools:f2fs-tools_host_toolchain", ] } foreach(_platform, target_platform_list) { if (!enable_ramdisk) { deps += [ ":${_platform}_updater_image" ] } }}
复制代码


  • 2、镜像单独编译前需要执行一次全量编译./build.sh --product-name rk3568 --ccache生成全部镜像

  • 3、然后在./build.sh --product-name rk3568 --ccache 后指定--build-target chip_prod_imagesys_prod_imagesystem_imageuserdata_imagevendor_imageupdater_image/updater_ramdisk_imageramdisk_image分别生成对应的单独镜像

  • --build-target updater_ramdisk_image 是编译出 ramdisk 类型的 updater.img

  • --build-target updater_image 是编译出非 ramdisk 类型的 updater.img

  • 目前 Beta5 版本的仍然可以选择编译非 ramdisk 类型和 ramdisk 类型的 updater.img,但是最新分支 master 版本 updater 与 enable_ramdisk 不再关联,都编译 ramdisk 类型的 updater.img 镜像,相关 issue:南向适配,归一化一级二级启动


例如执行./build.sh --product-name rk3568 --ccache --build-target updater_image生成非 ramdisk 类型的 updater.img



三、修改 OpenHarmonyBeta5 源码新增独立编译镜像的功能

  • OpenHarmonyBeta5 已经支持单独编译 多产品各自的 chipprod 镜像,且前面提到目前 Beta5 版本的仍然可以选择编译非 ramdisk 类型和 ramdisk 类型的 updater.img

  • 所以和 OpenHarmonyBeta4 中添加的代码不同,Beta5 不需要添加 group("chip_prod_image")的部分

  • 1、在 OpenHarmonyBeta5 源码 build/ohos/images/BUILD.gn 第 48 行添加如下内容


group("sys_prod_image") {  deps = []  if (is_standard_system) {    deps += [      "//third_party/e2fsprogs:e2fsprogs_host_toolchain",      "//third_party/f2fs-tools:f2fs-tools_host_toolchain",    ]  }  foreach(_platform, target_platform_list) {    deps += [ ":${_platform}_sys_prod_image" ]  }}
group("system_image") { deps = [] if (is_standard_system) { deps += [ "//third_party/e2fsprogs:e2fsprogs_host_toolchain", "//third_party/f2fs-tools:f2fs-tools_host_toolchain", ] } foreach(_platform, target_platform_list) { deps += [ ":${_platform}_system_image" ] }}
group("userdata_image") { deps = [] if (is_standard_system) { deps += [ "//third_party/e2fsprogs:e2fsprogs_host_toolchain", "//third_party/f2fs-tools:f2fs-tools_host_toolchain", ] } foreach(_platform, target_platform_list) { deps += [ ":${_platform}_userdata_image" ] }}
group("vendor_image") { deps = [] if (is_standard_system) { deps += [ "//third_party/e2fsprogs:e2fsprogs_host_toolchain", "//third_party/f2fs-tools:f2fs-tools_host_toolchain", ] } foreach(_platform, target_platform_list) { deps += [ ":${_platform}_vendor_image" ] }}
group("ramdisk_image") { deps = [] if (is_standard_system) { deps += [ "//third_party/e2fsprogs:e2fsprogs_host_toolchain", "//third_party/f2fs-tools:f2fs-tools_host_toolchain", ] } foreach(_platform, target_platform_list) { if (enable_ramdisk) { deps += [ ":${_platform}_ramdisk_image" ] } }}
group("updater_ramdisk_image") { deps = [] if (is_standard_system) { deps += [ "//third_party/e2fsprogs:e2fsprogs_host_toolchain", "//third_party/f2fs-tools:f2fs-tools_host_toolchain", ] } foreach(_platform, target_platform_list) { if (enable_ramdisk) { deps += [ ":${_platform}_updater_ramdisk_image" ] } }}
group("updater_image") { deps = [] if (is_standard_system) { deps += [ "//third_party/e2fsprogs:e2fsprogs_host_toolchain", "//third_party/f2fs-tools:f2fs-tools_host_toolchain", ] } foreach(_platform, target_platform_list) { if (!enable_ramdisk) { deps += [ ":${_platform}_updater_image" ] } }}
复制代码


  • 3、镜像单独编译前同样需要执行一次全量编译生成全部镜像

  • 4、然后在./build.sh --product-name rk3568 --ccache 后指定--build-target chip_prod_imagesys_prod_imagesystem_imageuserdata_imagevendor_imageupdater_image/updater_ramdisk_imageramdisk_image分别生成对应的单独镜像

四、指定 userdata.img 镜像进行独立编译并且刷入触觉智能 RK3568

  • 1、笔者基于 OpenHarmony Beta5 源码如上述步骤修改源码后执行./build.sh --product-name rk3568 --ccache --build-target userdata_image单独编译生成 userdata.img

  • 2、触觉智能 rk3568 这款开发板镜像链接如下


链接:https://pan.baidu.com/s/1JXEBH9CQb4ruzOGz1prrjA?pwd=1234 提取码:1234 
复制代码


  • 3、解压触觉智能 rk3568 开发板镜像后替换 userdata.img,将完整镜像刷入开发板



  • 4、烧录完毕,系统正常启动。

知识点附送

如何更改 OpenHarmony 版本信息、SDK 和 NDK 版本信息

  • 源码目录下/sources/build/version.gni 文件是 OpenHarmony 版本信息、SDK 和 NDK 版本信息,要修改版本信息只需要在这个文件修改就好了

  • 例如,Beta5 的版本信息如下


# OHOS versiondeclare_args() {  sdk_version = "3.2.10.6"  api_version = "9"
# Release type, optional values: Betax, RCx... release_type = "Beta5" meta_version = "3.0.0"}
# ohos SDK versiondeclare_args() { current_sdk_version = sdk_version}
# ohos NDK versiondeclare_args() { current_ndk_version = current_sdk_version}
复制代码

改变一个镜像文件的名称需要做哪些工作

  • 以该 issues 为参考 https://gitee.com/openharmony/build/issues/I5VQZ7 学习将 vendor.img 改为 chipset.img,其实只要把 vendor 字符全部替换成 chipset。通过这个 issue 可以知道 vendor.img 涉及到源码中哪些文件

关于 --build-target

  • build-target 是传给 ninja 的参数,out/rk3568/build.ninja 里面的任务都可以。

  • 1、gn 里面的一个 target 都可以,包括可执行程序,动态库,group,action,部件名

  • 2、如果直接指定名称报 unkonw target 的话,可能是重名等原因,按照 gn 的全名称指定:{目标所在 BUILD.gn 的路径}:{目标名}, 比如: --build-target commonlibrary/c_utils/base:utils

  • 3、build-target 参数一次可以指定多,比如:--build-target A --build-target B

  • 4、subsystem_name 不是编译目标

  • 5、部件名是一个特殊的目标,根据 ohos.build 编译系统生产的 gn 目标,如果直接指定部件名,使用--build-target {部件名} 报错 unkonw target,可以使用一个部件的全名称指定:--build-target out/{device_name}/build_configs/{subsystem_name}/{part_name}:{part_name}


编译流程主要分为:preloader->loader->gn->ninja 这四个过程

如何修改分区文件系统类型由 ext4 为 f2fs

以该issues为例学习将修改/data 分区文件系统由 ext4 为 f2fs。


  • 1、修改镜像文件打包描述文件每个系统镜像文件都是由一个 image_conf.txt 描述文件来描述。将镜像文件系统类型由 ext4 改为 f2fs。userdata.img 由 build/ohos/images/mkimage/userdata_image_conf.txt 描述。在其中将--fs_type=ext4 改为--fs_type=f2fs

  • 2、在 rk3568 标准系统的 defconfig 文件中打开prjquota 使能开关,在源码目录在 kernel/linux/config/linux-5.10/arch/arm64/configs/rk3568_standard_defconfig 中第 5945 行中# CONFIG_QUOTA is not set改为CONFIG_QUOTA=y

  • 3、修改具体设备的 fstab 文件(这里修改的是 rk3568 的 fstab 文件,位于/device/board/hihope/rk3568/cfg/fstab.rk3568)中修改分区的文件系统类型mnt_flags and optionsfs_mgr_flags参数



fstab 文件:启动的时候,系统会自动地从这个文件读取信息,并且会自动将此文件中指定的文件系统挂载到指定的目录

修改镜像打包的配置参数调整分区大小

  • 以该issue为例学习将 rk3568 updater 分区从 20MB 调整为 30MB。

  • 1、如果要修改某个镜像的打包参数,只需要修改//build/ohos/images/mkimage 目录下对应的{镜像名}_image_config.txt 文件即可。

  • 2、在 ramdisk 类型的 updater.img 对应的描述文件 build/ohos/images/mkimage/updater_ramdisk_image_conf.txt 第二行将 20971520KB 改为 33554432KB。

发布于: 13 小时前阅读数: 7
用户头像

离北况归

关注

还未添加个人签名 2022-03-26 加入

OpenHarmony啃论文俱乐部PIMF团队。 位于南京一学生,可私信。

评论

发布
暂无评论
[触觉智能RK3568]指定单个OpenHarmony镜像进行独立编译_OpenHarmony_离北况归_InfoQ写作社区