鸿蒙南向开发—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查看
更多鸿蒙实战技术学习可以前往主页,鸿蒙的学习路线思维图分享(略缩图)
高清完整版,前往主页或者四我保存,附带文档
相关文章:
鸿蒙南向开发—OpenHarmony技术编译构建框架
概述 OpenHarmony编译子系统是以GN和Ninja构建为基座,对构建和配置粒度进行部件化抽象、对内建模块进行功能增强、对业务模块进行功能扩展的系统,该系统提供以下基本功能: 以部件为最小粒度拼装产品和独立编译。支持轻量、小型、标准三种系…...
Android Jetpack学习系列——Navigation
写在前面 Google在2018年就推出了Jetpack组件库,但是直到今天我才给重视起来,这真的不得不说是一件让人遗憾的事。过去几年的空闲时间里,我一直在尝试做一套自己的组件库,帮助自己快速开发,虽然也听说过Jetpack&#…...
编程语言的新趋势
随着科技的飞速发展,IT行业经历了巨大的变革,其中编程语言作为技术生态的核心要素,其演变趋势对整个行业影响深远。从过去到现在,再到未来,编程语言的发展都呈现出明显的时代特征。本文将探讨当前IT行业的现状…...
C++:类和对象(2)
目录 1.strcut和class的区别 2.将成员属性设置为私有 3.对象的初始化和清理 3.1 构造函数和析构函数 3.1.1 构造函数语法 3.1.2 析构函数语法 3.1.3 检验 3.2 构造函数的分类和调用 3.3 拷贝构造函数调用 1.strcut和class的区别 struct和class的唯一区别在于默认的访问…...
【React系列】网络框架axios库的使用
本文来自#React系列教程:https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. axios库的基本使用 1.1. 网络请求的选择 目前前端中发送网络请求的方式有很多种: 选择一:传统的Aj…...
pygame学习(二)——绘制线条、圆、矩形等图案
导语 pygame是一个跨平台Python库(pygame news),专门用来开发游戏。pygame主要为开发、设计2D电子游戏而生,提供图像模块(image)、声音模块(mixer)、输入/输出(鼠标、键盘、显示屏)模…...
TCL学习笔记(持续更新)
前言: TCL(tool common language)是一种通用工具语言,很多eda tool都支持tcl,学习了解一些tcl基本语法还是很有必要的。 1:基础概念 解释器: #!/usr/bin/tclsh 打印: puts -> p…...
Xpath的问题:为什么在DOM中确定存在(可见)的元素,用//表达式匹配不到(附解决办法)
今天遇到一个很有意思的问题,我的爬取的目标页面上有时会出现一个弹窗,它挡住我点击其它按钮了,我想找到它的关闭按钮,自动点击一下关闭掉,本来是很简单的事情,但偏偏出问题了,DOM中看到的html是…...
有没有游泳可以戴的耳机?游泳耳机入耳式好,还是骨传导好
游泳是一项既能锻炼身体又能让人放松心情的运动。我们知道,音乐能够为我们的水上时光增添更多的乐趣。那么,在众多游泳耳机中,如何选择一款既适合自己的需求又具备良好性能的产品呢? 首先,我们要了解的是,…...
【绘图软件】自用安装教程
链接:https://pan.baidu.com/s/17r9Pr460FzkULU7fTr91_w?pwdftv7 提取码:ftv7 --来自百度网盘超级会员V6的分享解压并且右键打开set up 解压crack软件前需要退出杀毒软件, 关闭实时保护 域网络关闭,专用网络关闭࿰…...
AIGC时代-GPT-4和DALL·E 3的结合
在当今这个快速发展的数字时代,人工智能(AI)已经成为了我们生活中不可或缺的一部分。从简单的自动化任务到复杂的决策制定,AI的应用范围日益扩大。而在这个广阔的领域中,有两个特别引人注目的名字:GPT-4和D…...
springBoot集成RabbitMQ实现(直连模式\路由模式\广播模式\主题模式)的消息发送和接收
该项目介绍了springboot如何集成rabbitMQ消息中间件,实现(直连模式\路由模式\广播模式\主题模式)的消息发送和接收 pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId...
Attention机制
目录 提出背景 Attention原理 Attention机制本质思想 Attention机制总结 改进:Self-Attention 前置知识:RNN,LSTM/GRU 提出背景 Attention模型是基于Encoder-Decoder框架提出的。Encoder-Decoder框架,也就是编码-解码框架&…...
Rust 常用的第三方库
Rust 的标准库虽然已经很强大,但如果恰当地使用第三方库,可以大大改善编程效率。以下是一些常用的 Rust 第三方库。 tokio ---- 最通用的异步编程库,几乎可以说是行业标准了,大量的其它库依赖于tokio。reqwest ---- HTTP 客户端库…...
构建高可用性Java应用:介绍分布式系统设计与开发
构建高可用性Java应用需要考虑许多因素,其中之一是设计和开发分布式系统。分布式系统是由多个独立计算机或节点组成的系统,这些节点通过网络连接,共同完成一项任务。 在分布式系统设计和开发中,有几个关键方面需要考虑࿱…...
x-cmd pkg | gitui - git 终端交互式命令行工具
目录 简介首次用户功能特点类似工具与竞品进一步探索 简介 gitui 由 Stephan D 于 2020 年使用 Rust 语言构建的 git 终端交互式命令行工具,旨在终端界面中便捷管理 git 存储库。 首次用户 使用 x gitui 即可自动下载并使用 在终端运行 eval "$(curl https:/…...
javaWeb案例知识点
一.rest风格编程 二.综合案例结构 三.分页查询 分页插件PageHelper 四.部门管理开发 五.员工管理开发 六.文件上传...
SQL日期列更新操作详解
在实际的数据库管理过程中,有时我们需要对数据库中的日期列进行更新。这篇博客将详细介绍一条 SQL 语句,该语句用于更新 referral_up_order 表中的多个日期列,并将它们的日期部分更改为 2023-10-24,同时保留原始时间部分。 1、背…...
stable diffusion 基础教程-图生图
界面 图生图大概有以下几个功能: 图生图涂鸦绘制局部绘制局部绘制(涂鸦蒙版)其常用的也就上面四个,接下来逐步讲解。 以图反推提示词 图生图可以根据反推提示词来获取相应图片的提示词,目前3种主流方式,如下: CLIP反推提示词:推导出的文本倾向于自然语言的描述方式,…...
如何获取高质量的静态住宅代理?常见问题与误区
静态住宅IP代理在今天的网络营销领域扮演着至关重要的角色,静态住宅IP代理以其稳定性和高匿名性,为互联网业务提供了一个安全的执行环境。通过模拟真实用户的网络行为,这些IP代理降低了企业在网络营销活动中被识别和封禁的风险。它保护了企业…...
基于SpringBoot的旅游网站281
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的旅游网站281,java项目。…...
做外贸没客户就静下来沉淀
最近有人说,现在手上的各种群都变得很安静了,像之前,到各种节日,比如国庆,冬至,元旦这些。群里都非常热闹,不说全部人,总会有几个人发红包,或者发祝贺信息的。今年发现&a…...
网络流总结
网络流总结 基础知识最大流最小割定理 最大流EKdinic模型二分图匹配无源汇上下界可行流有源汇上下界最大、最小流多源汇最大流最大流之关键边最大流之拆点最大流建图实战 最小割模型最大权闭合子图最大密度子图最小点权覆盖集最大点权独立集最小割建图实战 费用流EK模型费用流与…...
安卓11通过脚本修改相应板型系统属性
安卓10以后rk的一套源码兼容很多板型,多种cpu型号都兼容了,这一点相比之前省心了很多,所以就诞生了需要一套代码兼容多种板子的需求,定制修改中需要经常修改系统属性,通过以下脚本一次实现: #!/bin/bashfu…...
网络安全—PKI公钥基础设施
文章目录 前提知识散列函数非对称加密数字签名 PKI受信任的人RA注册CA颁发IKE数字签名认证(交换证书)密钥管理 前提知识 散列函数 散列也可以叫哈希函数,MD5、SHA-1、SHA-2、、(不管叫啥,都记得是同一个东西就行&…...
推荐一款加速器,也可加速github
地址https://github.com/BeyondDimension/SteamTools...
springboot框架,中间库是mognodb,可以写入2个数据库的Demo
1-springboot版本: 2.3.9.RELEASE POM.xml文件: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&quo…...
基于Java SSM框架实现旅游资源网站系统项目【项目源码+论文说明】
基于java的SSM框架实现旅游资源网站系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个旅游资源网站 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述旅…...
015、控制流运算符match
1. 控制流运算符match Rust中有一个异常强大的控制流运算符:match,它允许将一个值与一系列的模式相比较,并根据匹配的模式执行相应代码。模式可由字面量、变量名、通配符和许多其他东西组成;后文会详细介绍所有不同种类的模式及它…...
个人博客主题 vuepress-hope
文章目录 1. 简介2. 配置2.1 个人博客,社媒链接配置 非常推荐vuepress-hope 1. 简介 下面的我的博客文章的截图 通过md写博客并且可以同步到github-page上 2. 配置 2.1 个人博客,社媒链接配置 配置文件 .vuepress/theme.ts blog: {medias: {BiliB…...
wordpress dream chaser/企业培训公司有哪些
在实际开发过程中,服务与服务之间通信经常会使用到消息中间件,而以往使用了哪个中间件比如RabbitMQ,那么该中间件和系统的耦合性就会非常高,如果我们要替换为Kafka那么变动会比较大,这时我们可以使用SpringCloudStream…...
wordpress页面居中/站长工具seo综合查询
一. 批量操作思路 # 待新增 路由系统中有,但是数据库中还没有路由系统的集合 - 数据库中权限集合# 待更新 路由系统中有,数据库中也有, 只是更改了一些信息路由系统的集合 & 数据库中的权限集合# 待删除 数据库中有,路由中没有的数据库权限集合 - 路由系统集合 二 . 权限…...
导航网址网站怎么做/沈阳关键词seo排名
一、Eureka特性1.当注册中心挂了,客户端之间依然可以通过原有的注册表进行调用;注册中心重启后,客户端会继续注册进来 2.当服务提供者挂了,在关闭自我保护的情况下,注册中心在规定时间(默认是60s࿰…...
石柱网站制作/有利于seo优化的是
nvm nvm是node版本管理工具。为了解决node各种版本存在不兼容现象,nvm是让你在同一台机器上安装和切换不同版本的node的工具。 nvm安装 在安装nvm之前,首先需要卸载电脑上已安装的node/npm。 Windows nvm安装下载nvm-windows https://github.com/co…...
建设网app下载安装/seo推广平台服务
cpu_shares是如何影响这个cpu时间片的,这就需要去看一下linux进程调度原理。 Linux 调度器 内核默认提供了5个调度器,Linux内核使用struct sched_class来对调度器进行抽象∶ Stop调度器,stop_sched class∶优先级最高的调度类,可…...
日照网站建设官方网站/百度人工
1.首先确定要计算时间的时区,jdk8支持,根据时区ID来判断是否处于夏令时。 2.根据要判断时区的id和对应的时间,即可判断出是否处于夏令时。 public static boolean currentTimeIsDaylightTime(long time) { Calendar calendar Calendar.ge…...