一丶背景介绍

很多小伙伴可能会有在OH中新增镜像的需求,下面为大家介绍一下,如何在OH系统框架中新增一个镜像。

本文章由移远通信技术股份有限公司提供,以下内容包含了个人理解,仅供参考,如有不合理处,请联系笔者修改/删除,18107158288(微信同号)。

二丶环境信息

软件版本:Openharmony-5.1-Release

硬件信息:dayu200

 

三丶实现步骤

在openharmony系统中,如果想单独新增一个镜像,好多小伙伴不知道如何操作,结合自己的经验现在来给大家分享下如何新增一个镜像,直接上干货。

 

1.

修改点路径为:build\ohos_var.gni

修改内容为,参考其他镜像(chip_prod)格式,添加一个别名:

declare_args() {

.........

........

  # chip_prod package dir
  chip_prod_base_dir = "chip_prod"

  # nvdata1 package dir    自己新增的镜像
  nvdata1_base_dir = "nvdata1"

}

2.

修改点路径为:build\ohos\images\BUILD.gn

修改内容为,添加自定义的nvdata1到镜像列表中:

 

 image_list = [
    "system",
    "vendor",
    "userdata",
    "sys_prod",
    "chip_prod",
    "updater_ramdisk",
    "eng_system",
    "eng_chipset",
    "nvdata1",
  ]

在制作镜像的时候,添加自己的镜像nvdata1

group("make_images") {
  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}_eng_chipset_image",
        ":${_platform}_eng_system_image",
        ":${_platform}_sys_prod_image",
        ":${_platform}_system_image",
        ":${_platform}_updater_ramdisk_image",
        ":${_platform}_userdata_image",
        ":${_platform}_vendor_image",
        ":${_platform}_nvdata1_image",
      ]
      if (enable_ramdisk) {
        deps += [ ":${_platform}_ramdisk_image" ]
      }
    }
    deps += [ ":chip_prod_image" ]
    if (is_standard_system && device_name == "rk3568") {
      deps += [ ":mk_chip_ckm_img" ]
    }
  } else {
    deps += [ "//build/ohos/packages:packer" ]
  }
}

 

新增自己的镜像文件模块:

group("nvdata1_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}_nvdata1_image" ]
  }
}

 

3.

修改路径为:build\ohos\images\build_image.py

修改点为:

新增一个函数:

def _prepare_nvdata1(nvdata1_path: str):
    if os.path.exists(nvdata1_path):
        shutil.rmtree(nvdata1_path)
    os.makedirs(nvdata1_path, exist_ok=True)

函数的调用的地方:

    if os.path.exists(args.output_image_path):
        os.remove(args.output_image_path)
    if args.image_name == 'userdata':
        _prepare_userdata(args.input_path)
    elif args.image_name == 'nvdata1':
        _prepare_nvdata1(args.input_path)  

 

4.

修改路径:build\ohos\images\mkimage\dac.txt

修改点,添加镜像的权限:

eng_system,                 00777,      0,          2000,       0
eng_chipset,                00777,      0,          2000,       0
nvdata1,                    00777,      0,          2000,       0

5.

修改路径:build\templates\metadata\gen_module_info.py

修改点:

在主函数会有三个修改点添加路径:

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--system-base-dir', required=True)
    parser.add_argument('--ramdisk-base-dir', required=True)
    parser.add_argument('--vendor-base-dir', required=True)
    parser.add_argument('--updater-base-dir', required=True)
    parser.add_argument('--updater_vendor-base-dir', required=True)
    parser.add_argument('--eng_system-base-dir', required=True)
    parser.add_argument('--nvdata1-base-dir', required=True)



...........新增路径

    if args.install_images:
        install_dests = gen_install_dests(
            args.system_base_dir, args.ramdisk_base_dir, args.vendor_base_dir, args.updater_base_dir,
            args.updater_vendor_base_dir, args.sys_prod_base_dir, args.chip_prod_base_dir,
            args.eng_system_base_dir, args.nvdata1_base_dir, args.eng_chipset_base_dir, source_file_name,
            args.install_images, args.module_install_dir, args.relative_install_dir, args.type)



...........新增路径

def gen_install_dests(system_base_dir, ramdisk_base_dir, vendor_base_dir, updater_base_dir,
                      updater_vendor_base_dir, sys_prod_base_dir, chip_prod_base_dir,
                      eng_system_base_dir, nvdata1_base_dir,eng_chipset_base_dir, source_file_name, install_images,
                      module_install_dir, relative_install_dir, module_type):

参考其他镜像,对于新增镜的自定义像也按照模板复制

        elif image == 'eng_system':
            dest = _gen_install_dest(eng_system_base_dir, module_install_dir,
                                     relative_install_dir, module_type)
        elif image == 'nvdata1':
            dest = _gen_install_dest(nvdata1_base_dir, module_install_dir,
                                     relative_install_dir, module_type)  



6.

修改路径为:build\ohos\packages\modules_install.py

修改点:

    nvdata1_install_base_dir = os.path.join(args.platform_installed_path,
                                           'nvdata1')
    if os.path.exists(nvdata1_install_base_dir):
        shutil.rmtree(nvdata1_install_base_dir)
        print('remove nvdata1 dir...')

7.

修改路径为:build\templates\metadata\module_info.gni

修改点:

action(target_name) {
    args = [
      "--system-base-dir",
      system_base_dir,
      "--ramdisk-base-dir",
      ramdisk_base_dir,
      "--vendor-base-dir",
      vendor_base_dir,
      "--updater-base-dir",
      updater_base_dir,
      "--sys_prod-base-dir",
      sys_prod_base_dir,
      "--eng_system-base-dir",
      eng_system_base_dir,
      "--nvdata1-base-dir",
      nvdata1_base_dir,

 

8.

新建镜像的nvdata1_image_conf.txt文件

内容如下:

/nvdata1
4194304
--fs_type=ext4
--dac_config ../../build/ohos/images/mkimage/dac.txt
--file_context obj/base/security/selinux_adapter/file_contexts.bin

 

然后build\ohos\images\mkimage\和 build\ohos\images\mkimage\debug\nvdata1_image_conf.txt 路径下放一份,内容一样。

9.

修改路径:

base\security\selinux_adapter\sepolicy\base\system\file_contexts

修改点,因为dayu200适配了selinux,所以还需要修改下selinux的内容,如果OH的版本没有适配selinux,以下的步骤都可以忽略了,直接开始编译了

/nvdata1       u:object_r:rootfs:s0





/nvdata1(/.*)?           u:object_r:nvdata1_file:s0

 

10.

修改路径为:

base\security\selinux_adapter\sepolicy\whitelist\partition_label_use_whitelist.txt

修改内容:

/nvdata1(/.*)?     u:object_r:nvdata1_file:s0

 

11.

修改路径为:

base\security\selinux_adapter\scripts\selinux_check\config\partition_label.txt

修改内容,为:

u:object_r:nvdata1_file:s0

 

12.

修改路径为:

base\security\selinux_adapter\sepolicy\base\public\file.te

修改内容为:

type nvdata1_file, nvdata1_file_attr, file_attr;

 

13.

修改路径为:

base\security\selinux_adapter\sepolicy\base\public\attributes

修改内容为:

# Type of all nvdata1 files.
# i.e. /nvdata1/*
attribute nvdata1_file_attr;

 

以上修改完成之后,就可以开始使用编译指令编译自己的镜像了。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐