0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙OpenHarmony开发板:【产品配置规则】

jf_46214456 来源:jf_46214456 作者:jf_46214456 2024-05-09 10:32 次阅读

产品配置规则

产品解决方案为基于开发板的完整产品,主要包含产品对OS的适配、部件拼装配置、启动配置和文件系统配置等。产品解决方案的源码路径规则为:vendor/{产品解决方案厂商}/{产品名称} _。

产品解决方案的目录树规则如下:

vendor                              
└── company                         # 产品解决方案厂商
    ├── product                     # 产品名称
    │   ├── init_configs
    │   │     ├── etc               # init进程启动配置(可选,仅linux内核需要)
    │   │     └── init.cfg          # 系统服务启动配置
    │   ├── hals                    # 产品解决方案OS适配
    │   ├── BUILD.gn                # 产品编译脚本
    │   └── config.json             # 产品配置文件
    │   └── fs.yml                  # 文件系统打包配置
    └── ......

icon-note.gif注意 :新增产品须按如上的规则创建目录和文件,编译构建系统将按该规则扫描已配置的产品。
开发前请熟悉鸿蒙开发指导文档:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]点击或者复制转到。
关键的目录和文件详细介绍如下:

  1. vendor/company/product/init_configs/etc 该文件夹中包含rcS脚本,Sxxx脚本和fstab脚本。init进程在启动系统服务之前执行这些脚本。执行的流程为“rcS->fstab->S00-xxx“。Sxxx脚本中的内容与开发板和产品需要有关,主要包括设备节点的创建、创建目录、扫描设备节点、修改文件权限等等。这些文件在产品编译的BUILD.gn中按需拷贝到产品out目录中,最终打包到rootfs镜像中。

  2. vendor/company/product/init_configs/init.cfg init进程启动服务的配置文件,当前支持解析的命令有:

    • start: 启动某个服务
    • mkdir: 创建文件夹
    • chmod: 修改指定路径/文件的权限
    • chown: 修改指定路径/文件的属组
    • mount: 挂载命令
      该文件中的各个字段的解释如下:
    {
        "jobs" : [{                                                     # job数组,一个job对应一个命令集合。job的执行顺序:pre-init - > init - > post-init。
                "name" : "pre-init",
                "cmds" : [
                    "mkdir /storage/data",                              # 创建目录
                    "chmod 0755 /storage/data",                         # 修改权限,权限值的格式为0xxx, 如0755
                    "mkdir /storage/data/log",
                    "chmod 0755 /storage/data/log",
                    "chown 4 4 /storage/data/log",                      # 修改属组,第一个数字为uid, 第二个数字为gid
                    ......
                    "mount vfat /dev/mmcblock0 /sdcard rw,umask=000"    # 挂载,格式为: mount [文件系统类型] [source] [target] [flags] [data]
                                                                        # 其中flags仅支持:nodev、noexec、nosuid和rdonly
                ]
            }, {
                "name" : "init",
                "cmds" : [                                              # 按cmds数组顺序启动启动服务
                    "start shell",                                      # 注意:start与服务名称之间有且只有一个空格
                    ......
                    "start service1"
                ]
            }, {
                "name" : "post-init",                                   # 最后执行的job, init进程启动完成后的处理(如驱动初始化后再mount设备)
                "cmds" : []
            }
        ],
        "services" : [{                                                 # service数组,一个service对应一个进程
                "name" : "shell",                                       # 服务名称
                "path" : ["/sbin/getty", "-n", "-l", "/bin/sh", "-L", "115200", "ttyS000", "vt100"],    # 可执行文件全路径,path必须为第一个元素
                "uid" : 0,                                              # 进程的uid,须与二进制文件的uid保持一致
                "gid" : 0,                                              # 进程的gid,须与二进制文件的gid保持一致
                "once" : 0,                                             # 是否为一次性进程,1:进程退出后,init不在重新拉起。0:常驻进程,进程若退出,init将重新拉起
                "importance" : 0,                                       # 是否为关键进程,1:是关键进程,若进程退出,init将会重启单板。0:非关键进程,若进程退出,init不会重启单板
                "caps" : [4294967295]
            }, 
            ......
        ]
    }
    
  3. vendor/company/product/init_configs/hals 解决方案厂商对OS的适配,需要实现的接口请见各个部件的readme说明文档。

  4. vendor/company/product/config.json config.json为编译构建的主入口,包含了开发板、OS部件和内核等配置信息
    以基于hispark_taurus开发板的ipcamera产品为例,配置文件如下:

    {
         "product_name": "ipcamera",                       # 产品名称
         "version": "3.0",                                 # config.json的版本号, 固定"3.0"
         "type": "small",                                  # 系统类型, 可选[mini, small, standard]
         "ohos_version": "OpenHarmony 1.0",                # 选择的OS版本
         "device_company": "hisilicon",                    # 芯片厂商
         "board": "hispark_taurus",                        # 开发板名称
         "kernel_type": "liteos_a",                        # 选择的内核类型
         "kernel_version": "3.0.0",                        # 选择的内核版本
         "subsystems": [                            
           {
             "subsystem": "aafwk",                         # 选择的子系统
             "components": [
               { "component": "ability", "features":[ "enable_ohos_appexecfwk_feature_ability = true" ] }   # 选择的部件和部件特性配置
             ]
           },
           {
            ......
           }
          ......
          更多子系统和部件
         }
     }
    
  5. vendor/company/product/fs.yml 该文件用于配置文件系统镜像制作过程,将编译产物打包成文件系统镜像,比如用户态根文件系统rootfs.img和可读写的userfs.img。它由多个列表组成,每个列表对应一个文件系统。字段说明如下:

    fs_dir_name: 必填,声明文件系统文件名, 如rootfs、userfs
    fs_dirs:     选填,配置out下文件目录与文件系统文件目录的映射关系,每个文件目录对应一个列表
    source_dir:  选填,out下目标文件目录,若缺失则将根据target_dir在文件系统下创建空目录
    target_dir:  必填,文件系统下对应文件目录
    ignore_files:选填,声明拷贝忽略文件
    dir_mode:    选填,文件目录权限,默认755
    file_mode:   选填,该文件目录下所有文件的权限,默认555
    fs_filemode: 选填,配置需要特殊声明权限的文件,每个文件对应一个列表
    file_dir:    必填,文件系统下具体文件路径
    file_mode:   必填,文件权限声明
    fs_symlink:  选填,配置文件系统软连接
    fs_make_cmd: 必填,配置需要制作文件系统脚本,OS提供的脚本在build/lite/make_rootfs下, 支持linux,liteos内核和ext4、jffs2、vfat格式。也支持芯片解决方案厂商自定义。   
    fs_attr:     选填,根据配置项动态调整文件系统
    

    其中fs_symlink、fs_make_cmd字段支持以下变量:

    • rootpath代码根目录,对应gn的{ohos_root_path}
    • outpath产品out目录,对应gn的{root_out_dir}
    • ${fs_dir} 文件系统目录,由以下变量拼接而成
    • ${root_path}
    • ${fs_dir_name}

icon-note.gif注意 :fs.yml是可选的,对于没有文件系统的设备可不配置。

  1. vendor/company/product/BUILD.gn 产品编译的入口,主要用于编译解决方案厂商源码和拷贝启动配置文件。如果某个产品被选择为要编译的产品,那么对应产品目录下的BUILD.gn会默认编译。一个典型的产品编译BUILD.gn应该如下:
    group("product") {               # target名称需与product名称即三级目录名称一致
      deps = []
      deps += [ "init_configs" ]     # 拷贝init配置
      ......                         # 其他
    }
    

新增并编译产品

编译构建支持芯片解决方案和部件的灵活拼装,形成定制化的产品解决方案。具体步骤如下:

  1. 创建产品目录 按照产品配置规则创建产品目录,以基于“rtl8720“开发板的wifiiot模组为例,在代码根目录执行:

    mkdir -p vendor/my_company/wifiiot
    
  2. 拼装产品 在新建的产品目录下新建config.json文件,以步骤1中的wifiiot为例,vendor/my_company/wifiiot/config.json可以是:

    {
        "product_name": "wifiiot",                        # 产品名称
        "version": "3.0",                                 # config.json的版本号, 固定"3.0"
        "type": "small",                                  # 系统类型, 可选[mini, small, standard]
        "ohos_version": "OpenHarmony 1.0",                # 使用的OS版本
        "device_company": "realtek",                      # 芯片解决方案厂商名称
        "board": "rtl8720",                               # 开发板名称
        "kernel_type": "liteos_m",                        # 选择的内核类型
        "kernel_version": "3.0.0",                        # 选择的内核版本
        "subsystems": [                            
          {
            "subsystem": "kernel",                        # 选择的子系统
            "components": [
              { "component": "liteos_m", "features":[] }  # 选择的部件和部件特性
            ]
          },
          ...
          {
             更多子系统和部件
          }
        ]
    }
    

    icon-note.gif注意 :编译构建系统编译前会对device_company,board,kernel_type,kernel_version、subsystem、component字段进行有效性检查,其中device_company,board,kernel_type,kernel_version应与已知的芯片解决方案匹配,subsystem、component应与build/lite/components下的部件描述匹配。

  3. 适配OS接口 在产品目录下创建hals目录,并将产品解决方案对OS适配的源码和编译脚本放入该目录下。

  4. 配置系统服务 在产品目录下创建init_configs目录,并在init_configs目录下创建init.cfg文件,按需配置要启动的系统服务。

  5. 配置init进程(仅linux内核需要) 在init_configs目录下创建etc目录,然后在etc下创建init.d文件夹和fstab文件。最后按产品需求在init.d文件下创建并编辑rcS文件和Sxxx文件。

  6. 配置文件系统镜像(可选,仅支持文件系统的开发板需要) 在产品目录下创建fs.yml文件。fs.yml需按产品实际情况配置,一个典型的fs.yml文件如下:

    -
      fs_dir_name: rootfs # 镜像的名称
      fs_dirs:
        -
          # 将编译生成的out/my_board/my_product/bin目录下的文件拷贝到rootfs/bin中,并忽略测试bin
          source_dir: bin
          target_dir: bin
          ignore_files:
            - Test.bin
            - TestSuite.bin
        -
          # 将编译生成的out/my_board/my_product/libs目录下的文件拷贝到rootfs/lib中,忽略所有.a文件,并设置文件和文件夹的权限为644和755
          source_dir: libs
          target_dir: lib
          ignore_files:
            - .a
          dir_mode: 755
          file_mode: 644
        -
          source_dir: usr/lib
          target_dir: usr/lib
          ignore_files:
            - .a
          dir_mode: 755
          file_mode: 644
        -
          source_dir: config
          target_dir: etc
        -
          source_dir: system
          target_dir: system
        -
          source_dir: sbin
          target_dir: sbin
        -
          source_dir: usr/bin
          target_dir: usr/bin
        -
          source_dir: usr/sbin
          target_dir: usr/sbin
        -
          # 创建一个proc空目录
          target_dir: proc
        -
          target_dir: mnt
        -
          target_dir: opt
        -
          target_dir: tmp
        -
          target_dir: var
        -
          target_dir: sys
        -
          source_dir: etc
          target_dir: etc
        -
          source_dir: vendor
          target_dir: vendor
        -
          target_dir: storage
    
      fs_filemode:
        -
          file_dir: lib/ld-uClibc-0.9.33.2.so
          file_mode: 555
        -
          file_dir: lib/ld-2.24.so
          file_mode: 555
        -
          file_dir: etc/init.cfg
          file_mode: 400
      fs_symlink:
        -
          # 在rootfs/lib下创建软连接ld-musl-arm.so.1 - > libc.so
          source: libc.so
          link_name: ${fs_dir}/lib/ld-musl-arm.so.1
        -
          source: mksh
          link_name: ${fs_dir}/bin/sh
        -
          source: mksh
          link_name: ${fs_dir}/bin/shell
      fs_make_cmd:
        # 使用脚本将rootfs制作为ext4格式的image
        - ${root_path}/build/lite/make_rootfs/rootfsimg_linux.sh ${fs_dir} ext4
    -
      fs_dir_name: userfs
      fs_dirs:
        -
          source_dir: storage/etc
          target_dir: etc
        -
          source_dir: data
          target_dir: data
      fs_make_cmd:
        - ${root_path}/build/lite/make_rootfs/rootfsimg_linux.sh ${fs_dir} ext4
    
  7. 配置产品Patch(可选,视产品涉及部件是否需要打补丁而定) 在产品目录下创建patch.yml文件。patch.yml需按产品实际情况配置,一个典型的patch.yml文件如下:

    # 需要打patch的路径
    foundation/communication/dsoftbus:
      # 该路径下需要打的patch存放路径
      - foundation/communication/dsoftbus/1.patch
      - foundation/communication/dsoftbus/2.patch
    third_party/wpa_supplicant:
      - third_party/wpa_supplicant/1.patch
      - third_party/wpa_supplicant/2.patch
      - third_party/wpa_supplicant/3.patch
    ...
    

    配置完成后,编译时增加--patch参数,即可在产品编译前将配置的Patch文件打到对应目录中,再进行编译:

    hb build -f --patch
    
  8. 编写编译脚本 在产品目录下创建BUILD.gn文件,按产品实际情况编写脚本。以步骤1中的wifiiot为例,BUILD.gn示例如下:

    group("wifiiot") {             # target名称与产品名一致
      deps = []
      deps += [ "init_configs" ]   # 拷贝init配置
      deps += [ "hals" ]           # 将hals加入编译
      ......                       # 其他
    }
    
    `HarmonyOS与OpenHarmony鸿蒙文档籽料:mau123789是v直接拿`
    

搜狗高速浏览器截图20240326151547.png

  1. 编译产品。 主要有两种编译方式,[命令行方式和hb方式],这里以命令行方式为例,假设编译的产品名是hispark_taurus_standard,则编译命令是:
    ./build.sh --product-name hispark_taurus_standard --ccache
    

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 开发板
    +关注

    关注

    25

    文章

    5032

    浏览量

    97372
  • 鸿蒙
    +关注

    关注

    57

    文章

    2339

    浏览量

    42805
  • OpenHarmony
    +关注

    关注

    25

    文章

    3713

    浏览量

    16254
收藏 人收藏

    评论

    相关推荐

    OpenHarmony鸿蒙南向开发案例:【智能猫眼(基于Hi3518开发板)】

    基于Hi3518开发板,使用开源OpenHarmony开发的RTSP协议流媒体应用。达到将Hi3518开发板中摄像头获取的数据通过RTSP协议传输到手机并显示 。
    的头像 发表于 04-22 15:46 2010次阅读
    <b class='flag-5'>OpenHarmony</b><b class='flag-5'>鸿蒙</b>南向<b class='flag-5'>开发</b>案例:【智能猫眼(基于Hi3518<b class='flag-5'>开发板</b>)】

    鸿蒙OpenHarmony南向/北向快速开发教程-迅为RK3568开发板

    大家期待已久的迅为RK3568开发板终于迎来了鸿蒙4.1系统的强势支持!想知道如何实现快速开发学习吗?跟着我们一起来探索吧! 迅为RK3568开发板: 想象一下,你手中的RK3568
    发表于 07-23 10:44

    迅为RK3568开发板鸿蒙OpenHarmony系统固件烧写步骤

    1、迅为RK3568开发板鸿蒙OpenHarmony系统固件烧写首先拷贝烧写器(烧写器在光盘资料“iTOP-3568 开发板\01_【iTOP-RK3568
    发表于 08-26 17:45

    openharmony开发openharmony开发板

    现在市面上支持OpenHarmony开发板已经非常多了,OpenHarmony不仅仅只能在海思系列芯片上运行,比较常见的有HiSpark、小熊派系列。这些开发板都是基于海思的Hi38
    的头像 发表于 06-24 09:03 3670次阅读

    OpenHarmony开发板适配经验分享--王城

    OpenHarmony开发板适配经验分享 审核编辑:金巧
    的头像 发表于 12-28 14:46 1722次阅读
    <b class='flag-5'>OpenHarmony</b><b class='flag-5'>开发板</b>适配经验分享--王城

    OpenHarmony Dev-Board-SIG专场:龙芯开发板成功移植OpenHarmony

    OpenHarmony Dev-Board-SIG专场:龙芯开发板成功移植OpenHarmony
    的头像 发表于 12-28 15:24 1679次阅读
    <b class='flag-5'>OpenHarmony</b> Dev-Board-SIG专场:龙芯<b class='flag-5'>开发板</b>成功移植<b class='flag-5'>OpenHarmony</b>

    开发板如何适配OpenHarmony 3.2

    科技基于RK3568设计的HCPAD-100开发板以及基于RK3566设计的中控屏HongzPad2022在OpenHarmony 3.2 Beta5版本上的适配过程。 涉及到开发板的添加/u-boot /linux-5.10/
    的头像 发表于 04-04 01:35 1490次阅读

    OpenHarmony鸿蒙南向开发案例:【智能猫眼(基于3516开发板)】

    基于Hi3516开发板,使用开源OpenHarmony开发的RTSP协议流媒体应用。达到将Hi3516开发板中摄像头获取的数据通过RTSP协议传输到手机并显示 。
    的头像 发表于 04-19 22:01 599次阅读
    <b class='flag-5'>OpenHarmony</b><b class='flag-5'>鸿蒙</b>南向<b class='flag-5'>开发</b>案例:【智能猫眼(基于3516<b class='flag-5'>开发板</b>)】

    瑞芯微RK3566鸿蒙开发板OpenHarmony标准系统应用兼容性测试指导

    本文OpenHarmony标准系统应用兼容性测试指导,适用鸿蒙系统软件开发测试的新手入门学习课程,设备为触觉智能的瑞芯微RK3566开发板,型号Purple Pi OH。是Laval官
    的头像 发表于 09-10 11:56 373次阅读
    瑞芯微RK3566<b class='flag-5'>鸿蒙</b><b class='flag-5'>开发板</b><b class='flag-5'>OpenHarmony</b>标准系统应用兼容性测试指导

    瑞芯微RK3568鸿蒙开发板OpenHarmony系统修改cfg文件权限方法

    本文适用于OpenHarmony开源鸿蒙系统修改cfg文件权限方法,深圳触觉智能研发的RK3566、RK3568、RK3588等开发板、主板等产品均适用此教程
    的头像 发表于 09-11 13:26 895次阅读
    瑞芯微RK3568<b class='flag-5'>鸿蒙</b><b class='flag-5'>开发板</b><b class='flag-5'>OpenHarmony</b>系统修改cfg文件权限方法

    触觉智能Purple Pi OH鸿蒙开发板成功适配OpenHarmony5.0 Release,开启新征程

    触觉智能Purple Pi OH鸿蒙开发板,成功适配OpenHarmony5.0 Release版本!为大家带来OpenHarmony5.0特性讲解!关注触觉智能,为大家带来更多
    的头像 发表于 10-25 10:51 382次阅读
    触觉智能Purple Pi OH<b class='flag-5'>鸿蒙</b><b class='flag-5'>开发板</b>成功适配<b class='flag-5'>OpenHarmony</b>5.0 Release,开启新征程

    如何在开源鸿蒙OpenHarmony开启SELinux模式?RK3566鸿蒙开发板演示

    本文介绍开源鸿蒙OpenHarmony系统下,开启/关闭SELinux权限的方法,触觉智能Purple Pi OH鸿蒙开发板演示,已适配全新Open
    的头像 发表于 11-18 19:03 312次阅读
    如何在开源<b class='flag-5'>鸿蒙</b><b class='flag-5'>OpenHarmony</b>开启SELinux模式?RK3566<b class='flag-5'>鸿蒙</b><b class='flag-5'>开发板</b>演示

    如何在Linux系统实现屏幕旋转?触觉智能RK3568鸿蒙开发板演示

    本文介绍Linux系统实现屏幕旋转的方法,以解决产品形态的不同的展现方式,触觉智能EVB3568鸿蒙开发板演示,现已发布全新OpenHarmony5.0 Release固件!
    的头像 发表于 11-19 23:42 276次阅读
    如何在Linux系统实现屏幕旋转?触觉智能RK3568<b class='flag-5'>鸿蒙</b><b class='flag-5'>开发板</b>演示

    OpenHarmony属性信息怎么修改?触觉智能RK3566鸿蒙开发板来演示

    本文介绍开源鸿蒙OpenHarmony系统下,修改产品属性信息的方法,触觉智能Purple Pi OH鸿蒙开发板演示,已适配全新
    的头像 发表于 11-27 09:31 145次阅读
    <b class='flag-5'>OpenHarmony</b>属性信息怎么修改?触觉智能RK3566<b class='flag-5'>鸿蒙</b><b class='flag-5'>开发板</b>来演示

    OpenHarmony默认30秒熄屏太麻烦?触觉智能鸿蒙开发板教你轻松取消

    OpenHarmony系统开机后 30 秒会自动息屏,教大家两招轻松取消自动息屏,触觉智能Purple Pi OH鸿蒙开发板演示,已适配全新OpenHarmony5.0 Release
    的头像 发表于 12-09 11:45 200次阅读
    <b class='flag-5'>OpenHarmony</b>默认30秒熄屏太麻烦?触觉智能<b class='flag-5'>鸿蒙</b><b class='flag-5'>开发板</b>教你轻松取消