鸿蒙南向开发—OpenHarmony技术编译构建框架

概述

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

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

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

编译子系统的各部分关系,主要体现为:

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

系统架构

编译构建子系统架构

目录结构:

复制代码
SHELL
build
├── build_scripts                            # 编译相关的python脚本
├── common
├── config                                   # 编译相关的配置项
├── core
│   ├── build_scripts
│   └── gn                                    # 编译入口BUILD.gn配置
├── docs
├── gn_helpers.py
├── lite                                      # hb和preloader入口 
├── loader
├── misc
├── ohos
├── ohos.gni                                 # 汇总了常用的gni文件,方便各个模块一次性import
├── ohos_system.prop
├── ohos_var.gni
├── prebuilts_download_config.json
├── prebuilts_download.py
├── prebuilts_download.sh
├── print_python_deps.py
├── __pycache__
├── scripts
├── subsystem_config_example.json
├── subsystem_config.json
├── templates                                # c/c++编译模板定义
├── test.gni
├── toolchain                                # 编译工具链配置
├── tools                                    # 常用工具
├── version.gni
└── zip.py

编译构建流程

编译构建可以编译产品、部件和模块,但是不能编译子系统。编译构建流程如下图所示,主要分设置和编译两步:

hb set: 设置要编译的产品。

hb build: 编译产品、开发板或者部件。编译主要过程如下:

  • 读取编译配置:根据产品选择的开发板,读取开发板config.gni文件内容,主要包括编译工具链、编译链接命令和选项等。
  • 调用GN配置构建目标:调用gn gen命令,读取产品配置生成产品解决方案out目录和Ninja文件。
  • 调用Ninja:调用ninja -C out/board/product启动编译。
  • 系统镜像打包:将部件编译产物打包,设置文件属性和权限,制作文件系统镜像。

编译构建使用

环境配置

主要是安装编译所需的软件包,使用以下脚本一键安装就行:

复制代码
SH
./build/build_scripts/env_setup.sh

如果出现hb安装不成功,可以重装hb,相关命令:

复制代码
SH
#安装
python3 -m pip install --user build/hb


#将路径 export PATH=~/.local/bin:$PATH 更新到环境变量 ~/.bashrc


#卸载
python3 -m pip uninstall ohos-build   

编译构建

预编译

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

复制代码
SHELL
bash build/prebuilts_download.sh

执行编译命令

使用命令行方式或hb方式执行编译命令

命令行方式

全量版本的编译

Release版本 :

复制代码
SHELL
./build.sh --product-name {product_name}

Debug版本 :

复制代码
SHELL
./build.sh --product-name {product_name} --gn-args is_debug=true --build-target {target_name}

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 路径。

注:更多选项可使用-h查看

更多鸿蒙实战技术学习可以前往主页,鸿蒙的学习路线思维图分享(略缩图)

高清完整版,前往主页或者四我保存,附带文档

相关推荐
A_nanda30 分钟前
根据AI提示排查vue前端项目
前端·javascript·vue.js
happymaker06261 小时前
web前端学习日记——DAY05(定位、浮动、视频音频播放)
前端·学习·音视频
~无忧花开~1 小时前
React状态管理完全指南
开发语言·前端·javascript·react.js·前端框架
LegendNoTitle1 小时前
计算机三级等级考试 网络技术 选择题考点详细梳理
服务器·前端·经验分享·笔记·php
@大迁世界2 小时前
1.什么是 ReactJS?
前端·javascript·react.js·前端框架·ecmascript
BJ-Giser2 小时前
Cesium 基于EZ-Tree的植被效果
前端·可视化·cesium
键盘鼓手苏苏3 小时前
Flutter 三方库 p2plib 的鸿蒙化适配指南 - 实现高性能的端到端(P2P)加密通讯、支持分布式节点发现与去中心化数据流传输实战
flutter·harmonyos·鸿蒙·openharmony
加农炮手Jinx3 小时前
Flutter for OpenHarmony:postgrest 直接访问 PostgreSQL 数据库的 RESTful 客户端(Supabase 核心驱动) 深度解析与鸿蒙适配指南
数据库·flutter·华为·postgresql·restful·harmonyos·鸿蒙
加农炮手Jinx3 小时前
Flutter 组件 heart 适配鸿蒙 HarmonyOS 实战:分布式心跳监控,构建全场景保活检测与链路哨兵架构
flutter·harmonyos·鸿蒙·openharmony
钛态3 小时前
Flutter 三方库 http_mock_adapter — 赋能鸿蒙应用开发的高效率网络接口 Mock 与自动化测试注入引擎(适配鸿蒙 HarmonyOS Next ohos)
android·网络协议·flutter·http·华为·中间件·harmonyos