This action will force synchronization from OpenHarmony/build, which will overwrite any changes that you have made since you forked the repository, and can not be recovered!!!
Synchronous operation will process in the background and will refresh the page when finishing processing. Please be patient.
编译构建子系统提供了一个基于Gn和ninja的编译构建框架。
根据产品配置,编译生成对应的镜像包。其中编译构建流程为:
/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*
编译环境需要Ubuntu18.04及以上版本。
安装编译所需的程序包。
安装命令:
sudo apt-get install bison ccache default-jdk flex gcc-arm-linux-gnueabi gcc-arm-none-eabi genext2fs liblz4-tool libssl-dev libtinfo5 mtd-utils mtools openssl ruby scons unzip u-boot-tools zip
代码根目录下执行全量版本的编译命令
```
./build.sh --product-name {product_name}
```
编译结果镜像输出在 out/${device_name}/packages/phone/images/目录下。
编译命令支持选项
```
-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 # 快速重建,default=False
--log-level=LOG_LEVEL # 指定编译期间的日志级别','三个级别可选:debug, info and error,default='info'
--device-type=DEVICE_TYPE # 指定设备类型,default='default'
--build-variant=BUILD_VARIANT # 指定设备操作模式,default='user'
```
配置文件说明
OpenHarmony的配置文件主要有四个。
每个模块对应的BUILD.gn文件。 可以使用提供的模板,也可以使用gn语法规则自定义编写。
例子:
ohos_shared_library示例:
import("//build/ohos.gni")
ohos_shared_library("helloworld") {
sources = []
include_dirs = []
cflags = []
cflags_c = []
cflags_cc = []
ldflags = []
configs = []
deps =[] # 部件内模块依赖
# 跨部件模块依赖定义,
# 定义格式为 "部件名:模块名称"
# 这里依赖的模块必须是依赖的部件声明在inner_kits中的模块
external_deps = [
"part_name:module_name",
]
output_name = "" # 可选,模块输出名
output_extension = "" # 可选,模块名后缀
module_install_dir = "" # 可选,缺省在/system/lib64或/system/lib下, 模块安装路径,模块安装路径,从system/,vendor/后开始指定
relative_install_dir = "" # 可选,模块安装相对路径,相对于/system/lib64或/system/lib;如果有module_install_dir配置时,该配置不生效
install_images = [] # 可选,缺省值system,指定模块安装到那个分区镜像中,可以指定多个
part_name = "" # 必选,所属部件名称
}
ohos_executable示例:
ohos_executable模板属性和ohos_shared_library基本一致
注意:可执行模块(即ohos_executable模板定义的)默认是不安装的,如果要安装,需要指定install_enable = true
ohos_prebuilt_etc示例:
import("//build/ohos.gni")
ohos_prebuilt_etc("etc_file") {
source = "file"
deps = [] # 部件内模块依赖
module_install_dir = "" #可选,模块安装路径,从system/,vendor/后开始指定
relative_install_dir = "" #可选,模块安装相对路径,相对于system/etc;如果有module_install_dir配置时,该配置不生效
install_images = [] # 可选,缺省值system,指定模块安装到那个分区镜像中,可以指定多个
part_name = "" # 必选,所属部件名称
}
更多详细的模板信息请参照模块配置规则。
子系统中bundle.json文件或者ohos.build(看子系统具体支持哪一个,后续将全部用bundle.json)
bundle.json
{
"name": "@ohos/<component_name>", # HPM部件英文名称,格式"@组织/部件名称"
"description": "xxxxxxxxxxxxxxxxxxx", # 部件功能一句话描述
"version": "3.1", # 版本号,版本号与OpenHarmony版本号一致
"license": "MIT", # 部件License
"publishAs": "code-segment", # HPM包的发布方式,当前默认都为code_segment
"segment": {
"destPath": ""
}, # 发布类型为code_segment时为必填项,定义发布类型code_segment的代码还原路径(源码路径)
"dirs": {}, # HPM包的目录结构,字段必填内容可以留空
"scripts": {}, # HPM包定义需要执行的脚本,字段必填,值非必填
"licensePath": "COPYING",
"readmePath": {
"en": "README.rst"
},
"component": { # 部件属性
"name": "<component_name>", # 部件名称
"subsystem": "", # 部件所属子系统
"syscap": [], # 部件为应用提供的系统能力
"features": [], # 部件对外的可配置特性列表,一般与build中的sub_component对应,可供产品配置
"adapted_system_type": [], # 轻量(mini)小型(small)和标准(standard),可以是多个
"rom": "xxxKB" # ROM基线,没有基线写当前值
"ram": "xxxKB", # RAM基线,没有基线写当前值
"deps": {
"components": [], # 部件依赖的其他部件
"third_party": [] # 部件依赖的三方开源软件
},
"build": { # 编译相关配置
"sub_component": ["部件包含模块的gn目标"], # 部件编译入口,新增模块在此处配置
"inner_kits": [], # 部件间接口
"test": [] # 部件测试用例编译入口
}
}
}
bundle.json文件定义了子系统包含的部件。每个部件定义它所包含的模块目标component.build.sub_component,以及部件间交互的接口component.build.inner_kits, 测试用例component.build.test_list。部件包含的 模块目标component.build.sub_component是必须要说明的。
ohos.build
{
"parts": {
"napi": {
"module_list": [
"//foundation/arkui/napi:napi_packages" # 部件包含模块的gn目标
],
"inner_kits": [ # 部件间接口
],
"test_list": [ # 测试用例
"//foundation/arkui/napi:napi_packages_test",
"//foundation/arkui/napi/test/unittest:unittest"
]
}
"新增部件名": {
"module_list": [
"部件包含的gn目标" # 部件包含模块的gn目标
],
"inner_kits": [ # 部件间接口
],
"test_list": [ # 测试用例
"包含的测试用例",
]
}
}
......
"subsystem": "ace", # 所属子系统
}
ohos.build文件包含两个部分,subsystem部分说明了子系统的名称,parts部分定义了该子系统包含的部件,要添加一个部件,需要把该部件对应的内容添加进parts中去。添加的时候需要指明该部件包含的模块module_list,假如有提供给其它部件的接口,需要在inner_kits中说明,假如有测试用例,需要在test_list中说明,inner_kits与test_list没有也可以不添加。
这两个文件均在对应的子系统根目录下,新增模块均在指定的目录下新增模块的gn目标即可,如果要新增一个部件,则需要在部件目录中新建一个bundle.json或者ohos.build,然后再在//vendor/{product_company}/{product-name}/config.json中添加对应的部件,直接添加到原有部件后即可。具体流程请参照编译构建指导的配置规则与新增并编译不同配置,其中详细的介绍了如何添加一个模块、部件或者子系统。
成功添加验证:
vendor\产品厂商\产品名\config.json
{
"product_name": "MyProduct",
"version": "3.0",
"type": "standard",
"target_cpu": "arm",
"ohos_version": "OpenHarmony 1.0",
"device_company": "MyProductVendor",
"board": "MySOC",
"enable_ramdisk": true,
"subsystems": [
{
"subsystem": "ace",
"components": [
{ "component": "ace_engine_lite", "features":[""] }
]
},
...
]
}
指明了产品名,产品厂商,产品设备,版本,要编译的系统类型,以及产品包含的子系统。
build目录下的subsystem_config.json文件。
{
"arkui": {
"path": "foundation/arkui",
"name": "arkui"
},
"ai": {
"path": "foundation/ai",
"name": "ai"
},
......
}
该文件对子系统进行了说明,我们需要该子系统定义中的name与path,分别表示子系统的名称和所在文件夹路径。
ohos-sdk编译
**编译命令:**
``` ./build.sh --product-name ohos-sdk --ccache ```
**结果输出:**
``` out/sdk/packages/ohos-sdk/ ```
**ohos-sdk模块配置:**
``` build/ohos/sdk/ohos_sdk_description_std.json ```
如何将一个模块编译并打包到版本中?
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。