#创作者激励#[触觉智能RK3568]指定单个镜像进行独立编译 原创 精华

离北况归
发布于 2023-2-28 08:16
浏览
11收藏

【本文正在参加2023年第一期优质创作者激励计划】

@toc


往期回顾:[触觉智能RK3568使用体验]NAPI 类对象导出及其生命周期管理(上)


一、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

 #创作者激励#[触觉智能RK3568]指定单个镜像进行独立编译-鸿蒙开发者社区

 #创作者激励#[触觉智能RK3568]指定单个镜像进行独立编译-鸿蒙开发者社区

三、修改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,将完整镜像刷入开发板

 #创作者激励#[触觉智能RK3568]指定单个镜像进行独立编译-鸿蒙开发者社区

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

知识点附送

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

  • 源码目录下/sources/build/version.gni文件是OpenHarmony版本信息、SDK和NDK版本信息,要修改版本信息只需要在这个文件修改就好了
  • 例如,Beta5的版本信息如下
# OHOS version
declare_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 version
declare_args() {
  current_sdk_version = sdk_version
}

# ohos NDK version
declare_args() {
  current_ndk_version = current_sdk_version
}

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

关于 --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参数

 #创作者激励#[触觉智能RK3568]指定单个镜像进行独立编译-鸿蒙开发者社区

fstab文件:启动的时候,系统会自动地从这个文件读取信息,并且会自动将此文件中指定的文件系统挂载到指定的目录 #创作者激励#[触觉智能RK3568]指定单个镜像进行独立编译-鸿蒙开发者社区

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

  • 以该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。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2023-2-28 10:44:50修改
14
收藏 11
回复
举报
9条回复
按时间正序
/
按时间倒序
我叫阿伟
我叫阿伟

学到了,原来可以指定单个镜像进行独立编译

1
回复
2023-2-28 08:22:32
红叶亦知秋
红叶亦知秋

未来能不全量编译直接单独编译吗

回复
2023-2-28 10:40:28
离北况归
离北况归 回复了 红叶亦知秋
未来能不全量编译直接单独编译吗

可以全量编译出来全部镜像文件也可以单独出其中之一镜像文件

1
回复
2023-2-28 10:46:10
红叶亦知秋
红叶亦知秋 回复了 离北况归
可以全量编译出来全部镜像文件也可以单独出其中之一镜像文件

ok,感谢告知

回复
2023-2-28 14:36:07
liangkz_梁开祝
liangkz_梁开祝

你的学习方法非常值得称赞和学习。

通过学习对应仓库的issue以及解决issue的PR,可以非常深入地理解OpenHarmony一步步走向成熟的非常多的技术细节。

1
回复
2023-3-1 08:48:32
离北况归
离北况归 回复了 liangkz_梁开祝
你的学习方法非常值得称赞和学习。通过学习对应仓库的issue以及解决issue的PR,可以非常深入地理解OpenHarmony一步步走向成熟的非常多的技术细节。

谢谢梁老师,我继续努力😊😊😊

回复
2023-3-1 09:47:02
喝一大口可乐
喝一大口可乐

版本信息更改的方式学到了

1
回复
2023-3-3 11:38:12
带带小老弟
带带小老弟

能单独编译还是方便不少

1
回复
2023-3-3 15:49:14
青舟321
青舟321

可以的,准备入手一块3568体验下

1
回复
2023-3-6 11:50:27
回复
    相关推荐