衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鴻蒙OpenHarmony開發:【編譯構建指導】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-05-13 09:31 ? 次閱讀

編譯構建指導

概述

OpenHarmony編譯子系統是以GN和Ninja構建為基座,對構建和配置粒度進行部件化抽象、對內建模塊進行功能增強、對業務模塊進行功能擴展的系統,該系統提供以下基本功能:

  • 以部件為最小粒度拼裝產品和獨立編譯。
  • 支持輕量、小型、標準三種系統的解決方案級版本構建,以及用于支撐應用開發者使用IDE開發的SDK開發套件的構建。
  • 支持芯片解決方案廠商的靈活定制和獨立編譯。

適用范圍

本指導適用于輕量、小型、標準三種系統。[芯片解決方案配置規則]與[新增并編譯芯片解決方案]主要和輕量系統、小型系統相關,其他內容都是通用的。

基本概念及包含關系

在了解編譯構建子系統的能力前,應了解如下基本概念:

  • 平臺:開發板和內核的組合,不同平臺支持的子系統和部件不同。
  • 產品:產品是包含一系列部件的集合,編譯后產品的鏡像包可以運行在不同的開發板上。
  • 子系統:OpenHarmony整體遵從分層設計,從下向上依次為:內核層、系統服務層、框架層和應用層。系統功能按照“系統 > 子系統 > 部件”逐級展開,在多設備部署場景下,支持根據實際需求裁剪某些非必要的子系統或部件。子系統是一個邏輯概念,它具體由對應的部件構成。
  • 部件:對子系統的進一步拆分,可復用的軟件單元,它包含源碼、配置文件、資源文件和編譯腳本;能獨立構建,以二進制方式集成,具備獨立驗證能力的二進制單元。需要注意的是下文中的芯片解決方案本質是一種特殊的部件。
  • 模塊:模塊就是編譯子系統的一個編譯目標,部件也可以是編譯目標。
  • 特性:特性是部件用于體現不同產品之間的差異。
  • GN:Generate Ninja的縮寫,用于產生Ninja文件。
  • Ninja:Ninja是一個專注于速度的小型構建系統。
  • hb:OpenHarmony的命令行工具,用來執行編譯命令。

基于以上概念,編譯子系統通過配置來實現編譯和打包,該子系統主要包括:模塊、部件、子系統、產品。

圖1 產品、子系統、部件和模塊間關系

產品子系統部件模塊關系

圖1體現了編譯子系統的各部分關系,主要體現為:

  • 子系統是某個路徑下所有部件的集合,一個部件只能屬于一個子系統。
  • 部件是模塊的集合,一個模塊只能歸屬于一個部件。
  • 通過產品配置文件配置一個產品包含的部件列表,部件不同的產品配置可以復用。
  • 部件可以在不同的產品中實現有差異,通過變體或者特性feature實現。
  • 模塊就是編譯子系統的一個編譯目標,部件也可以是編譯目標。

運作機制

編譯構建可以編譯產品、部件和模塊,但是不能編譯子系統。編譯構建流程如下圖所示,主要分設置和編譯兩步:

圖2 編譯構建流程

編譯流程

  1. hb set: 設置要編譯的產品。
  2. hb build: 編譯產品、開發板或者部件。編譯主要過程如下:
    1. 讀取編譯配置:根據產品選擇的開發板,讀取開發板config.gni文件內容,主要包括編譯工具鏈、編譯鏈接命令和選項等。
    2. 調用GN:調用gn gen命令,讀取產品配置生成產品解決方案out目錄和Ninja文件。
    3. 調用Ninja:調用ninja -C out/board/product啟動編譯。
    4. 系統鏡像打包:將部件編譯產物打包,設置文件屬性和權限,制作文件系統鏡像。

約束限制

編譯環境目前主要支持Ubuntu18.04和Ubuntu20.04(Ubuntu22.04暫不支持)。

環境配置

安裝編譯所需的程序包。 安裝命令:

  • 安裝方式一:使用腳本,在當前工程目錄執行

    ./build/build_scripts/env_setup.sh
    
  • 安裝方式二:apt-get和pip3 install命令安裝

    apt-get update -y 
    apt-get install -y  
    # 如果是ubuntu20.04系統請直接安裝python3.9,如果是ubuntu18.04請改為安裝python3.8
    apt-get install -y apt-utils binutils bison flex bc build-essential make mtd-utils gcc-arm-linux-gnueabi u-boot-tools python3.9 python3-pip git zip unzip curl wget gcc g++ ruby dosfstools mtools default-jre default-jdk scons python3-distutils perl openssl libssl-dev cpio git-lfs m4 ccache zlib1g-dev tar rsync liblz4-tool genext2fs binutils-dev device-tree-compiler e2fsprogs git-core gnupg gnutls-bin gperf lib32ncurses5-dev libffi-dev zlib* libelf-dev libx11-dev libgl1-mesa-dev lib32z1-dev xsltproc x11proto-core-dev libc6-dev-i386 libxml2-dev lib32z-dev libdwarf-dev 
    apt-get install -y grsync xxd libglib2.0-dev libpixman-1-dev kmod jfsutils reiserfsprogs xfsprogs squashfs-tools  pcmciautils quota ppp libtinfo-dev libtinfo5 libncurses5 libncurses5-dev libncursesw5 libstdc++6  gcc-arm-none-eabi vim ssh locales doxygen
    apt-get install -y libxinerama-dev libxcursor-dev libxrandr-dev libxi-dev
    # python需要安裝以下模塊,repo文件在上一章節約束與限制的源碼獲取中得到。
    chmod +x /usr/bin/repo 
    pip3 install --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple requests setuptools pymongo kconfiglib pycryptodome ecdsa ohos-build pyyaml prompt_toolkit==1.0.14 redis json2html yagmail python-jenkins 
    pip3 install esdk-obs-python --trusted-host pypi.org 
    pip3 install six --upgrade --ignore-installed six
    #還需要安裝llvm,hc-gen,gcc_riscv32,Ninja,node-v14.15.4-linux-x64,GN,如果用戶使用的shell環境不是bash或者zsh的配置,則需要配置以下環境變量:
    # export PATH=/home/tools/llvm/bin:$PATH
    # export PATH=/home/tools/hc-gen:$PATH
    # export PATH=/home/tools/gcc_riscv32/bin:$PATH
    # export PATH=/home/tools/ninja:$PATH
    # export PATH=/home/tools/node-v12.20.0-linux-x64/bin:$PATH
    # export PATH=/home/tools/gn:$PATH
    # export PATH=~/.local/bin:$PATH
    

    icon-note.gif注意 :上述安裝ohos-build的過程中會安裝編譯工具hb,但有時會出現hb安裝不成功的情況,若安裝不成功,則按照[hb安裝]重新安裝。

配置規則

為了實現芯片解決方案、產品解決方案與OpenHarmony是解耦的、可插拔的,子系統、產品、部件、芯片解決方案、模塊、特性和系統能力需遵循一定的規則,具體配置規則見如下鏈接:

  • [產品配置規則]
  • [子系統配置規則]
  • [部件配置規則]
  • [模塊配置規則])
  • [Rust模塊配置規則]
  • [芯片解決方案配置規則]
  • [特性配置規則]
  • [系統能力配置規則]

編譯構建使用指導

目錄結構

/build                            # 編譯構建主目錄

├── __pycache__                   
├── build_scripts/                # 編譯相關的python腳本
├── common/                       
├── config/                       # 編譯相關的配置項
├── core
│   ├── gn/                       # 編譯入口BUILD.gn配置
    └── build_scripts/            
├── docs                          
gn_helpers.py*                    
lite/                             # hb和preloader入口                      
misc/
├── ohos                          # OpenHarmony編譯打包流程配置
│   ├── kits                      # kits編譯打包模板和處理流程
│   ├── ndk                       # ndk模板和處理流程
│   ├── notice                    # notice模板和處理流程
│   ├── packages                  # 版本打包模板和處理流程
│   ├── sa_profile                # sa模板和處理流程
│   ├── sdk                       # sdk模板和處理流程,包括sdk中包含的模塊配置
│   └── testfwk                   # 測試相關的處理
├── ohos.gni*                     # 匯總了常用的gni文件,方便各個模塊一次性import
├── ohos_system.prop              
├── ohos_var.gni*                 
├── prebuilts_download.sh*        
├── print_python_deps.py*         
├── scripts/                      
├── subsystem_config.json         
├── subsystem_config_example.json 
├── templates/                    # c/c++編譯模板定義
├── test.gni*                     
├── toolchain                     # 編譯工具鏈配置
├── tools                         # 常用工具
├── version.gni                   
├── zip.py*

`HarmonyOS與OpenHarmony鴻蒙文檔籽料:mau123789是v直接拿`

搜狗高速瀏覽器截圖20240326151344.png

編譯命令

首先,在源碼根目錄下執行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
    

    icon-caution.gif注意: Debug全版本因鏡像大小限制,全量編譯可能無法燒錄,建議單模塊編譯Debug二進制。使用如下命令單獨編譯模塊:

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

    {product_name}為當前版本支持的平臺。比如:hispark_taurus_standard等。
    編譯完成后,結果鏡像保存在 out/{device_name}/packages/phone/images/ 目錄下。

  • 編譯命令支持選項:./build.sh

    -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方式

hb是OpenHarmony的命令行工具,用來執行編譯命令。以下對hb的常用命令進行說明。

hb set

設置要編譯的產品

hb set -h
usage: hb set [-h] [-root [ROOT_PATH]] [-p]

optional arguments:
  -h, --help            show this help message and exit
  -root [ROOT_PATH], --root_path [ROOT_PATH]
                        Set OHOS root path
  -p, --product         Set OHOS board and kernel
  • hb set 后無參數,進入默認設置流程
  • hb set -root dir可直接設置代碼根目錄
  • hb set -p設置要編譯的產品

hb env

查看當前設置信息

hb env
[OHOS INFO] root path: xxx
[OHOS INFO] board: hispark_taurus
[OHOS INFO] kernel: liteos
[OHOS INFO] product: ipcamera
[OHOS INFO] product path: xxx/vendor/hisilicon/ipcamera
[OHOS INFO] device path: xxx/device/hisilicon/hispark_taurus/sdk_linux_4.19

hb build

編譯產品、部件、模塊或芯片解決方案。

hb build -h
usage: hb build [-h] [-b BUILD_TYPE] [-c COMPILER] [-t [TEST [TEST ...]]] [-cpu TARGET_CPU] [--dmverity] [--tee]
                [-p PRODUCT] [-f] [-n] [-T [TARGET [TARGET ...]]] [-v] [-shs] [--patch] [--compact-mode]
                [--gn-args GN_ARGS] [--keep-ninja-going] [--build-only-gn] [--log-level LOG_LEVEL] [--fast-rebuild]
                [--device-type DEVICE_TYPE] [--build-variant BUILD_VARIANT]
                [component [component ...]]

positional arguments:
  component             name of the component, mini/small only

optional arguments:
  -h, --help            show this help message and exit
  -b BUILD_TYPE, --build_type BUILD_TYPE
                        release or debug version, mini/small only
  -c COMPILER, --compiler COMPILER
                        specify compiler, mini/small only
  -t [TEST [TEST ...]], --test [TEST [TEST ...]]
                        compile test suit
  -cpu TARGET_CPU, --target-cpu TARGET_CPU
                        select cpu
  --dmverity            enable dmverity
  --tee                 Enable tee
  -p PRODUCT, --product PRODUCT
                        build a specified product with {product_name}@{company}
  -f, --full            full code compilation
  -n, --ndk             compile ndk
  -T [TARGET [TARGET ...]], --target [TARGET [TARGET ...]]
                        compile single target
  -v, --verbose         show all command lines while building
  -shs, --sign_haps_by_server
                        sign haps by server
  --patch               apply product patch before compiling
  --compact-mode        compatible with standard build system set to false if we use build.sh as build entrance
  --gn-args GN_ARGS     specifies gn build arguments, eg: --gn-args="foo="bar" enable=true blah=7"
  --keep-ninja-going    keeps ninja going until 1000000 jobs fail
  --build-only-gn       only do gn parse, do not run ninja
  --log-level LOG_LEVEL
                        specifies the log level during compilationyou can select three levels: debug, info and error
  --fast-rebuild        it will skip prepare, preloader, gn_gen steps so we can enable it only when there is no change
                        for gn related script
  --device-type DEVICE_TYPE
                        specifies device type
  --build-variant BUILD_VARIANT
                        specifies device operating mode
  • 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

說明:

  • 設備開發過程中詳細的編譯環境搭建及編譯步驟請參考[快速入門中的環境搭建及編譯章節。]
  • OpenHarmony還為開發者提供了Docker編譯環境,可以省略編譯工具的安裝,具體使用請參考[Docker編譯指導。]

新增并編譯不同配置

根據上一節的配置規則新增相應配置并進行編譯,主要包含產品、部件、芯片解決方案和模塊四個粒度。具體如下:

  • [新增并編譯產品]
  • [新增并編譯部件]
  • [新增并編譯模塊]
  • [新增并編譯芯片解決方案]

常見問題

  • [常見編譯問題和解決方法]

參考信息

  • [關于deps、external_deps的使用]
  • [Sanitizer使用說明]
  • [開源軟件Notice收集策略說明]
  • [加快本地編譯的一些參數]
  • [查看NinjaTrace]
  • [定制打包chip_prod鏡像使用說明]

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編譯
    +關注

    關注

    0

    文章

    661

    瀏覽量

    33040
  • 鴻蒙
    +關注

    關注

    57

    文章

    2392

    瀏覽量

    43050
  • OpenHarmony
    +關注

    關注

    25

    文章

    3744

    瀏覽量

    16577
收藏 人收藏

    評論

    相關推薦

    OpenHarmony 移植:build lite 編譯構建過程

    配置完畢產品解決方案、芯片開發板解決方案,就可以執行 hb build 進行編譯。但是產品解決方案代碼是如何被調用編譯的? 芯片開發板解決方案代碼是如何被調用
    的頭像 發表于 02-19 16:19 ?1009次閱讀

    鴻蒙OpenHarmony開發板解析:【Rust模塊配置規則和指導

    Rust是一門靜態強類型語言,具有更安全的內存管理、更好的運行性能、原生支持多線程開發等優勢。Rust官方也使用Cargo工具來專門為Rust代碼創建工程和構建編譯OpenHarmony
    的頭像 發表于 05-10 11:32 ?1384次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OpenHarmony</b><b class='flag-5'>開發</b>板解析:【Rust模塊配置規則和<b class='flag-5'>指導</b>】

    鴻蒙開發:【OpenHarmony 4.0 Release指導

    OpenHarmony 4.0版本如期而至,開發套件同步升級到API 10。相比3.2 Release版本,新增4000多個API,應用開發能力更加豐富;HDF新增200多個HDI接口,硬件適配更加便捷;我們持續優化圖形框架和方
    的頭像 發表于 05-14 09:59 ?1632次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>:【<b class='flag-5'>OpenHarmony</b> 4.0 Release<b class='flag-5'>指導</b>】

    鴻蒙南向開發OpenHarmony技術編譯構建框架

    概述 OpenHarmony編譯子系統是以GN和Ninja構建為基座,對構建和配置粒度進行部件化抽象、對內建模塊進行功能增強、對業務模塊進行功能擴展的系統,該系統提供以下基本功能: 以
    發表于 01-04 16:47

    鴻蒙開發編譯構建】講解

    的HAP部署到設備中。這種方式一般用于應用開發階段進行應用的調試、功能驗證等場景。 方式二:通過DevEco Studio的Build菜單欄的編譯選項進行構建,HAP的構建結果存放
    發表于 02-27 17:41

    鴻蒙OpenHarmony南向/北向快速開發教程-迅為RK3568開發

    4.1學習之旅了嗎?快來加入我們,一起探索鴻蒙4.1系統的無限魅力吧! 【北京迅為】OpenHarmony學習開發系列教程(第1期 北向基礎篇一) P0_先導課 P1_OpenHarmony
    發表于 07-23 10:44

    OpenHarmony輕量和小型系統編譯構建指導

    概述一個基于gn和ninja的構建系統,以支持OpenHarmony組件化開發為目標,提供以下基本功能:支持按組件拼裝產品并編譯。獨立構建
    發表于 05-25 10:46

    構建嵌入式開發平臺簡明指導編譯內核鏡像的詳細資料概述

    本文檔的主要內容詳細介紹的是構建嵌入式開發平臺簡明指導編譯內核鏡像的詳細資料概述
    發表于 06-19 08:00 ?10次下載

    openharmony鴻蒙區別

    OpenHarmony是HarmonyOS的開源版。 華為的鴻蒙操作系統是純自己研發的,但是openharmony卻不是華為的,openharmony是由開放原子開源基金會(OpenA
    的頭像 發表于 06-24 16:21 ?4212次閱讀

    詳解OpenHarmony編譯和燒錄

    在上一篇【博流 BL-HWC-G1 開發板試用】開箱及編譯燒錄官方程序(BL602 IoT SDK)中,我們講了這塊開發板使用官方SDK進行編譯燒錄,這一篇,我們來講
    的頭像 發表于 11-08 09:58 ?5637次閱讀
    詳解<b class='flag-5'>OpenHarmony</b>的<b class='flag-5'>編譯</b>和燒錄

    OpenHarmony Dev-Board-SIG專場:搭建編譯構建主要步驟

    OpenHarmony Dev-Board-SIG專場:搭建編譯構建主要步驟
    的頭像 發表于 12-28 14:37 ?1098次閱讀
    <b class='flag-5'>OpenHarmony</b> Dev-Board-SIG專場:搭建<b class='flag-5'>編譯</b><b class='flag-5'>構建</b>主要步驟

    OpenHarmony應用的編譯構建過程

    2022 年 3 月 31 日發布了最新的 IDE 工具 DevEco Studio 3.0 Beta3,仔細閱讀文檔后發現最新 OpenHarmony 應用的編譯構建過程已經公開。
    的頭像 發表于 04-21 08:13 ?3979次閱讀

    [鴻蒙]OpenHarmony4.0的Rust開發

    背景 Rust 是一門靜態強類型語言,具有更安全的內存管理、更好的運行性能、原生支持多線程開發等優勢。Rust 官方也使用 Cargo 工具來專門為 Rust 代碼創建工程和構建編譯
    的頭像 發表于 02-26 17:28 ?955次閱讀
    [<b class='flag-5'>鴻蒙</b>]<b class='flag-5'>OpenHarmony</b>4.0的Rust<b class='flag-5'>開發</b>

    瑞芯微RK3566鴻蒙開發OpenHarmony標準系統應用兼容性測試指導

    本文OpenHarmony標準系統應用兼容性測試指導,適用鴻蒙系統軟件開發測試的新手入門學習課程,設備為觸覺智能的瑞芯微RK3566開發板,
    的頭像 發表于 09-10 11:56 ?497次閱讀
    瑞芯微RK3566<b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>板<b class='flag-5'>OpenHarmony</b>標準系統應用兼容性測試<b class='flag-5'>指導</b>

    OpenHarmony源碼編譯后燒錄鏡像教程,RK3566鴻蒙開發板演示

    本文介紹瑞芯微主板/開發編譯OpenHarmony源碼后燒錄鏡像的教程,觸覺智能Purple Pi OH鴻蒙開發板演示。搭載了瑞芯微RK3
    的頭像 發表于 12-30 10:08 ?177次閱讀
    <b class='flag-5'>OpenHarmony</b>源碼<b class='flag-5'>編譯</b>后燒錄鏡像教程,RK3566<b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>板演示
    百家乐怎样赢| 百家乐官网现金游戏注册送彩金| 百家乐官网庄闲符号记| 百家乐投注哪个信誉好| 大发888手机真钱游戏| 百家乐官网概率统计| 澳门百家乐官网牌例| 百家乐挂机软件| 永利百家乐官网游戏| 网上百家乐赌博犯法吗| 百家乐英皇娱乐城| 浪卡子县| 百家乐免费试玩游戏| 云博投注| 百家乐官网必胜绝| 大发888娱乐场c17| 电脑百家乐官网的玩法技巧和规则 | 百家乐仿水晶筹码| bet365娱乐场| 明溪百家乐官网的玩法技巧和规则| 大发888娱乐出纳柜台| 网络百家乐官网大转轮| 威尼斯人娱乐城进不了| 百家乐官网园sun811.com| 百家乐计划工具| 带百家乐官网的时时彩平台| 百家乐官网开闲的几率多大| 大发888官网 平台| 游艇会百家乐官网的玩法技巧和规则| 大发888真钱游戏注册| 百家乐官网的路图片| 威尼斯人娱乐城lm0| 百家乐官网道具扫描| 大发888贴吧| 真人百家乐官网体验金| tt娱乐城备用| 博九网百家乐现金网| 缅甸百家乐官网论坛| 机器百家乐作弊| 百家乐官网tt娱乐平台| bet365会员注册|