问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

鸿蒙编译子系统详解:架构、预编译与编译流程

创作时间:
作者:
@小白创作中心

鸿蒙编译子系统详解:架构、预编译与编译流程

引用
CSDN
1.
https://m.blog.csdn.net/pjie131_/article/details/138291434

鸿蒙操作系统(HarmonyOS)作为华为自主研发的分布式操作系统,其编译子系统是系统开发中的重要组成部分。本文将详细介绍鸿蒙编译子系统的架构、预编译过程以及具体的编译流程,帮助开发者更好地理解和使用鸿蒙系统的编译工具链。

1.5 鸿蒙编译子系统详解

编译子系统提供了鸿蒙系统的编译构建架构,主要由shell脚本、Python脚本、GN脚本、JSON配置文件等组成。

1.5.1 系统架构

编译子系统位于目录build,主要的目录结构如下:

./build
├── build_scripts         // 编译入口脚本
├── common                // 共用配置
├── compile_standard_whitelist.json  // 白名单配置,4.0新增
├── config                // gn配置,语言、编译器、os、检查、安全等
├── core                  // gn入口及配置
├── docs                  // 文档
├── hb                    // hb工具源码,编译脚本
├── lite                  // 轻量级编译相关
├── ohos                  // 鸿蒙相关
├── ohos.gni              // gn导入总入口
├── ohos_var.gni          // gn全局变量定义
├── prebuilts_download_config.json  // 预编译配置
├── prebuilts_download.py            // 预编译下载脚本
├── prebuilts_download.sh            // 预编译下载入口
├── rust                            // rust配置
├── scripts                        // 主要编译脚本
├── subsystem_config.json          // 子系统配置
├── templates                      // gn模板定义
├── test.gni                       // 测试的配置
├── toolchain                      // gn工具链配置
├── tools                          // 工具,依赖检查、组件检查等

1.5.2 预编译下载

在编译开始前,需要下载工具软件,安装必要的依赖库。执行命令:

build/prebuilts_download.sh

预编译安装完成后,会生成prebuilts目录,其目录结构如下:

./prebuilts/
├── ark_tools
│   └── ark_js_prebuilts
├── build-tools
│   ├── common
│   └── linux-x86
├── clang
│   └── ohos
├── cmake
│   ├── linux-x86
│   └── windows-x86
├── develop_tools
│   ├── bpftool
│   └── pahole
├── gcc
│   └── linux-x86
├── mingw-w64
│   └── ohos
├── ohos-sdk
│   └── linux
├── python
│   └── linux-x86
└── rustc
    ├── linux-x86_64
    ├── rust-1.68.0-dev-x86_64-unknown-linux-gnu
    ├── rust-std-1.68.0-dev-aarch64-linux-ohos
    └── rust-std-1.68.0-dev-armv7-linux-ohos

编译中主要使用的工具是prebuilts/build-tools/linux-x86/bin下的gn、ninja,以及llvm工具链prebuilts/clang/ohos/linux-x86_64/llvm/bin

1.5.3 编译流程

预编译完成后,就可以执行编译命令了,以润和rk3568大禹200开发板编译为例,编译命令:

# 方式1
./build.sh --product-name rk3568
# 方式2
./build.py -p rk3568
# 方式3,hb需要提前安装,请参照之前的教程
hb set
hb build -f

1.5.3.1 build.sh脚本

build.sh处理流程:

build.sh中执行py脚本命令为:

prebuilts/python/linux-x86/current/bin/python3 build/hb/main.py build --product-name rk3568

1.5.3.2 build.py脚本

build.py处理流程:

与build.sh是一样,也是执行build/hb/main.py脚本。

1.5.3.3 hb命令

使用hb命令前,先要进行安装,再进行编译,命令为:

# 安装hb
pip3 install --user build/hb
# 如果安装了旧版本,需要先进行卸载
# pip3 uninstall ohos-build
# 选择产品,这里选择standard->hihope->rk3568
hb set
# 编译,-f是全部编译
hb build -f

hb被安装在~/.local/bin目录下,其源码如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from hb.__main__ import main
if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(main())

这里导入main并执行的的hb.main,位于脚本~/.local/lib/python3.8/site-packages/hb/__main__.py。其主要源码如下:

def main():
    in_ohos_dir, ohos_root_path = is_in_ohos_dir()
    if in_ohos_dir :
        entry_path = os.path.join(os.path.abspath(os.path.relpath(
            ohos_root_path, os.path.curdir)), 'build', 'hb', 'main.py')
        spec = importlib.util.spec_from_file_location('main', entry_path)
        api = importlib.util.module_from_spec(spec)
        spec.loader.exec_module(api)
        main_api = api.Main()
        main_api.main()
    else:
        raise Exception(
            "[OHOS_ERROR]: Please call hb utilities inside ohos source directory")
if __name__ == "__main__":
    sys.exit(main())

从源码可以看出,main()从build/hb/main.py导入main函数,并执行。

总结

尽管鸿蒙有三种编译方式,但最终执行的脚本都是build/hb/build.py。比较起来,shell脚本执行的内容最全面,hb工具较简洁。需要注意的是,如果是复杂的编译需求,比如有多个源码目录、多个鸿蒙版本、多个硬件级别的鸿蒙产品编译时,或者在自动编译部署的环境下,建议卸载hb,使用py脚本或是sh脚本。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号