OpenHarmony编译构建系统

这篇来聊聊OpenHarmony的编译构建,经过前面的实践,再来看编译构建。

编译构建概述

在官网中提到了,OpenHarmony编译子系统是以GN和Ninja构建为基座,对构建和配置粒度进行部件化抽象、对内建模块进行功能增强、对业务模块进行功能扩展的系统,该系统提供以下基本功能:

  • 以部件为最小粒度拼装产品和独立编译。
  • 支持轻量、小型、标准三种系统的解决方案级版本构建,以及用于支撑应用开发者使用IDE开发的SDK开发套件的构建。
  • 支持芯片解决方案厂商的灵活定制和独立编译。

hb、GN、Ninja

回想我们在OpenHarmony搭建编译环境的时候,进行了编译操作是怎么进行的了吗?首先是hb set 选择了wifiiot_hispark_pegasus,然后进行了全量编译操作hb build -f 。

▍ hb set

选择产品或者说选择一个编译的目录,我们可以自己创建自己的产品,哪怕他只有一个hello,world的功能。而其他的产品或者说代码都不会参与编译,这也解释了什么是最小的产品独立编译。编译什么是我们手动选择的,功能可大可小。

▍hb build

编译指定的产品(代码),根据指定的产品开发板,读取开发板config.gni文件的内容,主要是一些编译工具链和编译的配置选项。

我们也可以用-T修饰命令,让他只编译某一个源文件

hb build -T 路径:目标

▍BUILD.gn

这个文件应该说很熟悉了,每一个案例都要去写这个gn文件,gn是Generate ninja的缩写,用于产生ninja文件。在我们之前简单案例的开发中,如“hello,world”,gn文件就是一个编译脚本。

我们对nijia的印象不是很深,因为他是自动执行的,我们作为开发者没有去人工干涉他。

▍编译小总结

总结来说,hb就是OpenHarmony的命令行工具,用来执行编译命令。gn生成nijia文件,nijia是一个专注于速度的小型编译构建系统。他们三者在整个编译中的流程如下图所示:

整个编译构建的流程图如下:

OpenHarmony系统

OpenHarmony整体遵从分层设计,系统功能按照“系统 > 子系统 > 组件”逐级展开,在多设备部署场景下,支持根据实际需求裁剪某些非必要的子系统或部件,非常的灵活,高内聚低耦合。

配置规则

▍组件配置规则

遵循:{领域(子系统集)}/{子系统}/{组件}的一个规则,从下面的源码中可以看出:

###▍组件定义

组件定义在build/lite/components/下:

定义就是一个JSON文件,由一个总的components数组包含每一个component对象,对象中包含了组件的所有属性。

至此,我们知道怎么去定义组件,定义在哪里,也就能新建组件了。但是新出现的组件,怎么能后加入到编译中呢,targets参数其实已经说明清楚了,下面通过Wifi组件的案例做具体解释。

▍WiFi组件

我们可以根据targets参数追踪到目录中/foundation/communication/wifi/BUILD.gn文件中的wifi

$WIFI_ROOT_DIR表示/foundation/communication/wifi,之后继续跟踪,这些dependences,完成相应BUILD.gn脚本的执行,也就让组件被编译系统所识别,完成组件的编译了。

▍组件总结

▍芯片解决方案配置规则

芯片解决方案的路径如下图所示:

芯片解决方案组件会随产品选择的开发板默认编译。

▍产品解决方案配置规则

产品解决方案的路径如下图所示:

产品解决方案,在config.json文件中进行配置:

  • “product_name”: 产品名称,指定为"wifiiot_hispark_pegasus"。

  • “type”: 产品类型,被标记为"mini"。

  • “version”: 产品版本号,标记为"3.0"。

  • “ohos_version”: 操作系统版本,使用的是OpenHarmony 1.0。

  • “device_company”: 设备制造公司,此产品由"hisilicon"制造。

  • “device_build_path”: 设备构建路径,指定为"device/board/hisilicon/hispark_pegasus"。

  • “board”: 开发板名称,被标记为"hispark_pegasus"。

  • “kernel_type”: 内核类型,使用的是"liteos_m"。

  • “kernel_is_prebuilt”: 内核是否预构建,被标记为true。

  • “kernel_version”: 内核版本号,此处为空。

  • “subsystems”: 子系统列表,包含了产品的不同子系统及其组件信息。

  • “component”: 组件名称,表示不同的功能组件。

  • “features”: 特性列表,描述了组件的不同特性。

  • “subsystem”: 子系统名称,表示不同的功能区域。

  • “components”: 组件列表,表示在该子系统中使用的组件及其特性。

  • “third_party_dir”: 第三方库路径,指定为"//device/soc/hisilicon/hi3861v100/sdk_liteos/third_party"。

  • “product_adapter_dir”: 产品适配层路径,指定为"//vendor/hisilicon/hispark_pegasus/hals"。

最后,也就能看到我们的hb set从顶层,选择vendor下的产品解决方案,通过方案中的各个子系统集,子系统,组件,进行编译。

新增自己的产品解决方案

▍组件定义

1.首先,在application/sample下创建一个myComponent等如下目录

2.完成组件功能的编写component.c

#include <stdio.h>
#include "ohos_init.h"

void entry(void){
    printf("test component!"); // 哪怕这个解决方案是个hello,world呢
}

SYS_RUN(entry);

BUILD.gn

static_library(test){
    sources = [
        "component.c"
    ]
    include_dirs = [
        "//commonlibrary/utils_lite/include"
    ]
}

3.定义组件在build/lite/components/创建application1.json编写如下代码:

{
    "components": [
      {
        "component": "myComponent",
        "description": "a test component",
        "optional": "true",
        "dirs": [
          "applications/sample/myComponent"
        ],
        "targets": [
          "//applications/sample/myComponent:test"
        ],
        "adapted_kernel": [ "liteos_m" ]
        }
    ]
}

我们可以使用 -T 修饰我们的编译命令,实现指定文件编译

hb build -f -T //applications/sample/myComponent:test

说明我们的组件编写没什么问题

▍ 解决方案定义

1.创建如下目录,并编写config.json配置文件

config.json

{
    "product_name": "product",
    "type": "mini",
    "version": "3.0",
    "ohos_version": "OpenHarmony 3.2",
    "device_company": "hisilicon",
    "device_build_path": "device/board/hisilicon/hispark_pegasus",
    "board": "hispark_pegasus",
    "kernel_type": "liteos_m",
    "kernel_is_prebuilt": true,
    "kernel_version": "",
    "subsystems": [
      {
        "subsystem": "applications1", // 用我们自己定义的子系统的组件
        "components": [
          { "component": "myComponent", "features":[] }
        ]
      },
      {
        "subsystem": "iothardware",
        "components": [
          { "component": "peripheral", "features":[] }
        ]
      },
      {
        "subsystem": "hiviewdfx",
        "components": [
          { "component": "hilog_lite", "features":[] },
          { "component": "hievent_lite", "features":[] },
          { "component": "blackbox", "features":[] },
          { "component": "hidumper_mini", "features":[] }
        ]
      },
      {
        "subsystem": "systemabilitymgr",
        "components": [
          { "component": "samgr_lite", "features":[] }
        ]
      },
      {
        "subsystem": "security",
        "components": [
          { "component": "device_auth", "features":[] },
          { "component": "huks", "features":
            [
              "disable_huks_binary = false",
              "disable_authenticate = false",
              "huks_use_lite_storage = true",
              "huks_use_hardware_root_key = true",
              "huks_config_file = \"hks_config_lite.h\"",
              "ohos_security_huks_mbedtls_porting_path = \"//device/soc/hisilicon/hi3861v100/sdk_liteos/third_party/mbedtls\""
            ]
          }
        ]
      },
      {
        "subsystem": "startup",
        "components": [
          { "component": "bootstrap_lite", "features":[] },
          { "component": "syspara_lite", "features":[] },
          { "component": "init_lite", "features":
            [
              "enable_ohos_startup_init_feature_begetctl_liteos = true",
              "enable_ohos_startup_init_lite_use_thirdparty_mbedtls = true"
            ]
          }
        ]
      },
      {
        "subsystem": "communication",
        "components": [
          { "component": "wifi_lite", "features":[] },
          { "component": "dsoftbus", "features":[] },
          { "component": "wifi_aware", "features":[]}
        ]
      },
      {
        "subsystem": "updater",
        "components": [
          { "component": "ota_lite", "features":[] }
        ]
      },
      {
        "subsystem": "commonlibrary",
        "components": [
          { "component": "file", "features":[] }
        ]
      },
      {
       "subsystem": "xts",
       "components": [
         { "component": "xts_acts", "features":
          [
            "enable_ohos_test_xts_acts_use_thirdparty_lwip = false"
          ]
         },
         { "component": "xts_tools", "features":[] },
         { "component": "device_attest_lite", "features":[] }
        ]
      }
    ],
    "third_party_dir": "//device/soc/hisilicon/hi3861v100/sdk_liteos/third_party",
    "product_adapter_dir": "//vendor/hisilicon/hispark_pegasus/hals"
  }

2.将hispark_pegasus下的hal/utils复制到我们自己的产品解决方案中

3.创建BUILD.gn文件编写编译脚本

group("product"){
    
}

▍编译检验

执行hb set命令,观察产品解决方案

完成编译

▍烧录测试

选择我们的产品解决方案product

串口调试,观察控制台输出

▍产品解决方案总结

结束语

希望能够帮助到大家,对OpenHarmony的编译过程有一个全面的感知。

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/539331.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二叉树-数据结构

二叉树-数据结构 二叉树是属性结构的一个重要类型。 如下图二叉树形状 二叉树特征如下&#xff1a; 1.二叉树由 n(n > 0) 个节点组成 2.如果 n 为 0&#xff0c;则为空树 3.如果 n 1&#xff0c;则只有一个节点称为根节点(root) 4.每个节点最多有两个节点&#xff0c;节…

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题2

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题2 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 任务书&#xff0c;赛题&#xff0c;解析等资料&#xff0c;知识点培训服务 添加博主wx&#xff1a;liuliu548…

【b站李同学的Lee】3 Github【gitgithub】入门教程,必学!

课程地址&#xff1a;【【git&github】入门教程&#xff0c;必学&#xff01;】 https://www.bilibili.com/video/BV1cE411G7yc/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 3 Github 3.1 注册 3.2 多人协作开发流程 3.2.1 远程仓库 …

MYSQL5.7详细安装步骤

MYSQL5.7详细安装步骤&#xff1a; 0、更换yum源 1、打开 mirrors.aliyun.com&#xff0c;选择centos的系统&#xff0c;点击帮助 2、执行命令&#xff1a;yum install wget -y 3、改变某些文件的名称 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base…

windows系统电脑弹窗“试图引用不存在令牌“如何解决?

windows系统电脑,弹出提示:试图引用不存在令牌,应该如何解决? 以管理员身份执行以下命令:(等命令执行完成即可修复该问题) cd C:\WINDOWS\system32 for /f %s in (dir /b *.dll) do regsvr32 /s %s 命令行解释: 这行代码是一个Windows命令提示符(cmd)命令。它使用一…

JAVA集合ArrayList

目录 ArrayList概述 add(element) 用法 add(index, element)用法 remove&#xff08;element&#xff09;用法 remove&#xff08;index&#xff09;用法 get(index)用法 set(index,element) 练习 test1 定义一个集合&#xff0c;添加字符串&#xff0c;并进行遍历&…

Redis 与 MySQL 数据一致性问题

1. 什么是数据库与缓存一致性 数据一致性指的是&#xff1a; 缓存中存有数据&#xff0c;缓存的数据值 数据库中的值&#xff1b;缓存中没有该数据&#xff0c;数据库中的值 最新值。 反推缓存与数据库不一致&#xff1a; 缓存的数据值 ≠ 数据库中的值&#xff1b;缓存或…

HCIP-Datacom(H12-821)题库补充(4月12日)

最新 HCIP-Datacom&#xff08;H12-821&#xff09;完整题库请扫描上方二维码访问&#xff0c;持续更新中。 在BGP进程下&#xff0c;Aggregate命令中的detail&#xff3f;suppressed关键字的作用是以下哪一项&#xff1f; A&#xff1a;抑制生成的聚合路由下发IP路由表 B&…

2024-简单点-观察者模式

先看代码&#xff1a; # 导入未来模块以支持类型注解 from __future__ import annotations# 导入抽象基类模块和随机数生成器 from abc import ABC, abstractmethod from random import randrange# 导入列表类型注解 from typing import List# 定义观察者模式中的主体接口&…

R语言绘图:绘制横向柱状图

代码主要实现&#xff1a; 对数据进行排序&#xff0c;并且相同分组的数据会有相同的颜色。最后&#xff0c;绘制横向柱状图。 # 加载ggplot2包 library(ggplot2)# 示例数据&#xff0c;假设有三列&#xff1a;Group, Variable, Value data <- data.frame(Group factor(c(…

GGUF类型模型文件

在HuggingFace上&#xff0c;我们时不时就会看到GGUF后缀的模型文件&#xff0c;它是如何来的&#xff1f;有啥特点&#xff1f; https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGUF GGUF 由来 Georgi Gerganov&#xff08;https://github.com/ggerganov&#xff09;是著…

机器学习基础入门(一)(机器学习定义及分类)

机器学习定义 给予计算机无需特意带有目的性编程便有学习能力的算法 深度学习算法 主要有监督学习和非监督学习两类 监督学习&#xff08;supervised learning&#xff09; 定义 1、学习由x映射到y的映射关系 2、主动给予机器学习算法正确示例&#xff0c;算法通过示例来学习…

Springboot+Vue项目-基于Java+MySQL的旅游网站系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

政安晨:【Keras机器学习实践要点】(二十七)—— 使用感知器进行图像分类

目录 简介 设置 准备数据 配置超参数 使用数据增强 实施前馈网络&#xff08;FFN&#xff09; 将创建修补程序作为一个层 实施补丁编码层 建立感知器模型 变换器模块 感知器模型 编译、培训和评估模式 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍…

改写STM32标准库函数中的fputc

int fputc(int ch, FILE *f) {unsigned char temp[1] {ch};HAL_UART_Transmit(&huart1, temp, 1, 0xFFFF);return ch; // 或者返回 0&#xff0c;表示写入成功 }标准库中的 printf 函数在执行输出时会调用 fputc 函数&#xff0c;将字符一个个发送到输出流中。通过重写 fp…

redis-哨兵模式

一&#xff0c;哨兵的作用&#xff1a; 通过发送命令&#xff0c;让Redis服务器返回监控其运行状态&#xff0c;包括主服务器和从服务器。当哨兵监测到master宕机&#xff0c;会自动将slave切换成master&#xff0c;然后通过发布订阅模式通知其他的从服务器&#xff0c;修改配…

数仓维度建模

维度建模 数仓建模方法1. 范式建模法&#xff08;Third Normal Form&#xff0c;3NF&#xff09;2. 维度建模法&#xff08;Dimensional Modeling&#xff09;3. 实体建模法&#xff08;Entity Modeling&#xff09; 维度建模1. 事实表事实表种类事务事实表周期快照事实表累计快…

008Node.js模块、自定义模块和CommonJs

CommonJS API定义很多普通应用程序(主要指非浏览器的应用)使用的API&#xff0c;从而填补了这个空白。它的终极目标是提供一个类似Python&#xff0c;Ruby和Java标 准库。这样的话&#xff0c;开发者可以使用CommonJS API编写应用程序&#xff0c;然后这些应用可以运行在不同的…

强大的数据分析计算软件:Stata 15 for Mac 激活版

Stata 15 for Mac是一款高级统计分析软件&#xff0c;具有强大的数据管理和数据提取工具。以下是其功能和特点的详细介绍&#xff1a; 软件下载&#xff1a;Stata 15 for Mac 激活版版下载 数据管理&#xff1a;Stata 15 for Mac支持多种数据库、数据格式和计算机语言&#xff…

软件定义车队面临网络安全的曲折之路

当以色列 REE Automotive 设计其 P7 电动汽车底盘时&#xff0c;它是从软件开始工作的&#xff1a;扁平的车辆底盘完全可配置&#xff0c;每个轮胎附近有四个独立的模块&#xff0c;用于转向、制动、悬架和动力传动系统&#xff0c;每个模块均由电子驱动控制单元&#xff08;EC…