当前位置: 首页 > news >正文

【鸿蒙系统】 ---Harmony 鸿蒙编译构建指导(一)

请添加图片描述

  • 💌 所属专栏:【鸿蒙系统】

  • 😀 作  者:我是夜阑的狗🐶

  • 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询!

  • 💖 欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信 😘 😘 😘

文章目录

  • 前言
  • 一、编译构建
      •  1.基本概念
  • 二、目录结构
  • 三、编译方式
      •  1.命令行方式
      •  2.hb方式
  • 总结


前言

  大家好,又见面了,我是夜阑的狗🐶,本文是专栏【鸿蒙系统】专栏的第1篇文章;
  今天也要开始学习鸿蒙系统了💖💖💖,开启新的征程,记录最美好的时刻🎉,每天进步一点点。在学习鸿蒙系统过程中,让我最头疼的就是编译速度好慢,从 git 上拉下来的源码编译过程都是全量编译,这让我倍感焦灼,于是就带着问题深入了解一下鸿蒙系统编译过程,看鸿蒙系统是否支持差分编译或者目标编译;

请添加图片描述

  专栏地址:【鸿蒙系统】 , 此专栏是我是夜阑的狗对python脚本处理的总结,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。
  如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。


一、编译构建

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

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

 1.基本概念

  在了解编译构建子系统的能力前,应了解如下基本概念:

  • 平台:开发板和内核的组合,不同平台支持的子系统和部件不同。
  • 产品:产品是包含一系列部件的集合,编译后产品的镜像包可以运行在不同的开发板上。
  • 子系统:OpenHarmony 整体遵从分层设计,从下向上依次为:内核层、系统服务层、框架层和应用层(详见OpenHarmony技术架构)。

请添加图片描述

系统功能按照“系统 > 子系统 > 部件”逐级展开,在多设备部署场景下,支持根据实际需求裁剪某些非必要的子系统或部件。子系统是一个逻辑概念,它具体由对应的部件构成。

  • 部件:对子系统的进一步拆分,可复用的软件单元,它包含源码、配置文件、资源文件和编译脚本;能独立构建,以二进制方式集成,具备独立验证能力的二进制单元。需要注意的是下文中的芯片解决方案本质是一种特殊的部件。
  • 模块:模块就是编译子系统的一个编译目标,部件也可以是编译目标。
  • 特性:特性是部件用于体现不同产品之间的差异。
  • GN:Generate Ninja 的缩写,用于产生 Ninja 文件。
  • Ninja:Ninja是一个专注于速度的小型构建系统。
  • hb:OpenHarmony 的命令行工具,用来执行编译命令。

  基于以上概念,编译子系统通过配置来实现编译和打包,该子系统主要包括:模块、部件、子系统、产品。

在这里插入图片描述
  该图体现了编译子系统的各部分关系,主要体现为:

  • 子系统是某个路径下所有部件的集合,一个部件只能属于一个子系统。
  • 部件是模块的集合,一个模块只能归属于一个部件。
  • 通过产品配置文件配置一个产品包含的部件列表,部件不同的产品配置可以复用。
  • 部件可以在不同的产品中实现有差异,通过变体或者特性 feature 实现。
  • 模块就是编译子系统的一个编译目标,部件也可以是编译目标。

二、目录结构

  编译构建子系统提供了一个基于 Gnninja 的编译构建框架。根据产品配置,编译生成对应的镜像包。其中编译构建流程为:

    1. 使用 Gn配置构建目标。
    1. Gn 运行后会生成 ninja 文件。
    1. 通过运行 ninja 来执行编译任务。
/build                           # 编译构建主目录
├── __pycache__                   
├── build_scripts/         	     # 编译相关的python脚本
├── config                       # 编译相关的配置项
├── core
│   └── gn                       # 编译入口BUILD.gn配置
├── loader                       # 各个部件配置加载、模板生成
├── ohos                         # OpenHarmony编译打包流程配置
│   ├── kits                     # kits编译打包模板和处理流程
│   ├── ndk                      # ndk模板和处理流程
│   ├── notice                   # notice模板和处理流程
│   ├── packages                 # 版本打包模板和处理流程
│   ├── sa_profile               # sa模板和处理流程
│   ├── sdk                      # sdk模板和处理流程,包括sdk中包含的模块配置
│   └── testfwk                  # 测试相关的处理
├── scripts                      # 编译相关的python脚本
├── templates                    # c/c++编译模板定义
└── toolchain                    # 编译工具链配置
├── tools                        # 常用工具

三、编译方式

  首先,在源码根目录下执行 prebuilts 脚本进行预编译,安装编译器及二进制工具。

bash build/prebuilts_download.sh

  接着,使用命令行方式或hb方式执行编译命令。

 1.命令行方式

  代码根目录下执行全量版本的编译命令:

  • Release版本 :

./build.sh --product-name {product_name}

  • Debug版本 :

/build.sh --product-name {product_name} --gn-args is_debug=true

  • 编译命令支持选项:./build.sh
```shell-h, --help                                        # 显示帮助信息并退出--source-root-dir=SOURCE_ROOT_DIR                 # 指定路径--product-name=PRODUCT_NAME                       # 指定产品名--device-name=DEVICE_NAME                         # 指定装置名称--target-cpu=TARGET_CPU                           # 指定CPU--target-os=TARGET_OS                             # 指定操作系统-T BUILD_TARGET, --build-target=BUILD_TARGET      # 指定编译目标,可以指定多个--gn-args=GN_ARGS                                 # GN参数,支持指定多个--ninja-args=NINJA_ARGS                           # Ninja参数,支持指定多个-v, --verbose                                     # 生成时显示所有命令行--keep-ninja-going                                # 让Ninja持续到1000000个工作失败--jobs=JOBS--export-para=EXPORT_PARA--build-only-gn                                   # 只做GN解析,不运行Ninja--ccache                                          # 可选  如果使用ccache,需要本地安装ccache--fast-rebuild                                    # 快速重建,默认值为False--log-level=LOG_LEVEL                             # 指定编译期间的日志级别','三个级别可选:debug, info and error,default='info'--device-type=DEVICE_TYPE                         # 指定设备类型,默认值为'default'--build-variant=BUILD_VARIANT                     # 指定设备操作模式,默认值为'user'

 2.hb方式

  hbOpenHarmony 的命令行工具,用来执行编译命令。以下对hb的常用命令进行说明。

hb set

  设置要编译的产品

  • hb set后无参数,进入默认设置流程

  • hb set -root dir 直接设置代码根目录

  • hb set -p 设置要编译的产品

在这里插入图片描述

hb env

  查看当前设置信息

在这里插入图片描述

hb build

  编译产品、部件、模块或芯片解决方案。

在这里插入图片描述

  • hb build 后无参数,会按照设置好的代码路径、产品进行编译,编译选项使用与之前保持一致。-f 选项将删除当前产品所有编译产品,等同于 hb clean + hb build.

  • hb build {component_name} :基于设置好的产品对应的单板、内核,单独编译部件(e.g.:hb build kv_store)。

  • hb build -p ipcamera@hisilicon :免set编译产品,该命令可以跳过set步骤,直接编译产品。

  • 在device/board/device_company下单独执行 hb build 会进入内核选择界面,选择完成后会根据当前路径的单板、选择的内核编译出仅包含内核、驱动的镜像。

hb clean

  清除 out 目录对应产品的编译产物,仅保留args.gn、build.log。清除指定路径可输入路径参数:hb clean out/board/product,默认将清除当前 hb set 的产品对应out路径,这里不执行啦。

hb clean
usage: hb clean [-h] [out_path]positional arguments:out_path    clean a specified path.optional arguments:-h, --help  show this help message and exit

  从上面提供编译选项可知,Harmony是支持模块编译的。


总结

  感谢观看,如果有帮助到你,请给文章点个赞和收藏,让更多的人看到。🌹 🌹 🌹

在这里插入图片描述

  也欢迎你,关注我。👍 👍 👍

  原创不易,还希望各位大佬支持一下,你们的点赞、收藏和留言对我真的很重要!!!💕 💕 💕 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!

更多专栏订阅:

  • 😀 【LeetCode题解(持续更新中)】
  • 🌼 【鸿蒙系统】
  • 👑 【Python脚本笔记】
  • 🚝 【Java Web项目构建过程】
  • 💛 【数字图像处理】
  • 【JavaScript随手笔记】
  • 🤩 【大数据学习笔记(华为云)】
  • 🦄 【程序错误解决方法(建议收藏)】
  • 🚀 【软件安装教程】



订阅更多,你们将会看到更多的优质内容!!

相关文章:

  • 【Python】使用selenium对Poe批量模拟注册脚本
  • Docker使用之java项目工程的部署
  • Linux操作系统-汇编LED驱动程序基础
  • FX-数组的使用
  • 【OCR】OCR开源文字识别工具
  • 力扣大厂热门面试算法题 33-35
  • [CISCN2019 华北赛区 Day1 Web5]CyberPunk --不会编程的崽
  • OPTIONS请求(跨域预检查)
  • Android 12.0 系统修改usb连接电脑mtp和PTP的显示名称
  • [概率论]期中考AB卷题目答案及详解
  • IDEA 配置阿里规范检测
  • Visio 2003简体中文版软件安装教程(附软件下载地址)
  • 【大模型学习记录】db-gpt源码安装问题汇总
  • 计算机毕业设计-基于Python的“哔哩哔哩视频网”视频热度分析
  • Python爬虫-数据采集和处理
  • 【5+】跨webview多页面 触发事件(二)
  • ES6核心特性
  • gulp 教程
  • iOS 系统授权开发
  • Java应用性能调优
  • Koa2 之文件上传下载
  • Netty 4.1 源代码学习:线程模型
  • React-flux杂记
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 将 Measurements 和 Units 应用到物理学
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 悄悄地说一个bug
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 以太坊客户端Geth命令参数详解
  • 责任链模式的两种实现
  • 正则与JS中的正则
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 阿里云重庆大学大数据训练营落地分享
  • ​ArcGIS Pro 如何批量删除字段
  • ​secrets --- 生成管理密码的安全随机数​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (31)对象的克隆
  • (52)只出现一次的数字III
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .Net(C#)自定义WinForm控件之小结篇
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .net中的Queue和Stack
  • /etc/fstab和/etc/mtab的区别
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [Android]如何调试Native memory crash issue
  • [c#基础]DataTable的Select方法
  • [codevs] 1029 遍历问题
  • [codevs1288] 埃及分数