如何向OpenHarmony中编译构建自己的子系统、部件和模块
如何向OpenHarmony中编译构建自己的子系统、部件和模块 目录 一、 引言... 1 二、 产品、子系统、部件和模块的关系... 2 三、 编译构建流程... 3 四、 添加步骤... 3 第一步:安装编译环境... 4 第二步:创建helloworld模块... 4 第三步:创建mytest模块... 6 第四步:创建hello部件... 7 第五步:OpenHarmony中添加子系统
如何向OpenHarmony中编译构建自己的子系统、部件和模块
目录
在OpenHarmony开发的复杂过程中,产品、子系统、部件和模块等概念扮演着至关重要的角色。它们不仅定义了OpenHarmony的结构,还影响了OpenHarmony的编译、打包以及最终的发布。本文档旨在详细阐述这些概念之间的关系,以及如何在OpenHarmony中添加自己的子系统、部件和模块。
图1
要编译构建自己的子系统、部件和模块,首先要了解它们的概念和关系
。
图1展示了产品、子系统、部件和模块之间的关系。通过这张图,我们可以清晰地看到它们之间的层次结构和依赖关系
- 产品:
产品是整个软件开发项目的最终成果,它是面向用户的完整软件。产品通常由多个子系统组成,每个子系统负责实现产品的某个特定功能或特性。
- 子系统:
子系统是产品的组成部分,它是某个路径下所有部件的集合。一个产品可以包含多个子系统。子系统通常负责实现产品的某个相对独立的功能模块,例如用户界面、数据库管理、驱动等。
- 部件:
部件是子系统的组成部分,它是由多个模块组成的集合。一个部件只能归属于一个子系统,而一个模块只能归属于一个部件。部件可以在不同的产品中实现有差异,通过变体或者特性(feature)来实现这种差异。例如,一个部件可能包含多个模块,这些模块在不同的产品配置中可能有不同的实现或配置。
- 模块:
模块是编译子系统的一个编译目标,也是部件的组成部分。模块通常包含了实现某个特定功能的代码和数据。在编译过程中,模块会被单独编译,并最终被打包到产品中。部件也可以是编译目标,这意味着整个部件的代码和数据会被一起编译和打包。
前面讲述的都是编译构建的一些原理,接下来正式开始讲述如何向OpenHarmony中添加自己的子系统、部件和模块。
下方将展示如何在开发者手机上运行自己的模块,其中包括新建2个模块、编译、烧写、运行等步骤,最终输出“Hello World!”和 “My test!”。
- 拉取openharmony开发者手机项目代码,在代码根目录创建sample子系统文件夹。
- 在子系统sample目录下创建hello部件文件夹及部件配置文件bundle.json。
- hello部件文件夹中创建helloworld模块文件夹和mytest模块文件夹。
- helloworld文件夹中创建helloworld源码目录,构建文件BUILD.gn。
- mytest文件夹中创建mytest源码目录,构建文件BUILD.gn。
示例完整目录如下。
第一步:安装编译环境
下载OpenHarmony开发者手机的源码和安装OpenHarmony的编译环境(编译环境请参考https://forums.openharmony.cn/forum.php?mod=viewthread&tid=897&extra=page%3D1)
第二步:创建helloworld模块
1、新建sample/hello/helloworld/src/helloworld.c目录及文件,代码如下所示,可以自定义修改打印内容
#include <stdio.h>
#include "helloworld.h"
int main(int argc, char **argv)
{
HelloPrint();
return 0;
}
void HelloPrint()
{
printf("\n\n");
printf("\n\t\tHello World!\n");
printf("\n\n");
}
2、再添加头文件sample/hello/helloworld/include/helloworld.h,代码如下所示。
#ifndef HELLOWORLD_H
#define HELLOWORLD_H
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif
void HelloPrint();
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif
#endif // HELLOWORLD_H
3、新建编译组织文件sample/hello/helloworld/BUILD.gn,具体编写语法可参考
https://docs.openharmony.cn/pages/v4.0/zh-cn/device-dev/subsystems/subsys-build-module.md
创建 BUILD.gn内容如下所示:
import("//build/ohos.gni") # 导入编译模板
ohos_executable("helloworld") { # 可执行模块
sources = [ # 模块源码
"src/helloworld.c"
]
include_dirs = [ # 模块依赖头文件目录
"include"
]
cflags = []
cflags_c = []
cflags_cc = []
ldflags = []
configs = []
deps =[] # 部件内部依赖
part_name = "hello" # 所属部件名称,必选
install_enable = true # 是否默认安装(缺省默认不安装),可选
}
第三步:创建mytest模块
1、新建sample/hello/mytest/src/mytest.cpp目录及文件,代码如下所示,可以自定义修改打印内容
#include <stdio.h>
#include "mytest.h"
int main(int argc, char **argv)
{
MyTestPrint();
return 0;
}
void MyTestPrint()
{
printf("\n\n");
printf("\n\t\tMy Test!\n");
printf("\n\n");
}
2、再添加头文件sample/hello/mytest/include/mytest.h,代码如下所示。
#ifndef MYTEST_H
#define MYTEST_H
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif
void MyTestPrint();
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif
#endif // MYTEST_H
3、新建编译组织文件sample/hello/mytest/BUILD.gn,具体编写语法可参考
https://docs.openharmony.cn/pages/v4.0/zh-cn/device-dev/subsystems/subsys-build-module.md
创建 BUILD.gn内容如下所示:
import("//build/ohos.gni") # 导入编译模板
ohos_executable("mytest") { # 可执行模块
sources = [ # 模块源码
"src/mytest.cpp"
]
include_dirs = [ # 模块依赖头文件目录
"include"
]
cflags = []
cflags_c = []
cflags_cc = []
ldflags = []
configs = []
deps =[] # 部件内部依赖
part_name = "hello" # 所属部件名称,必选
install_enable = true # 是否默认安装(缺省默认不安装),可选
}
第四步:创建hello部件
新建sample/hello/bundle.json文件,添加hello部件描述,创建语法可参考
https://docs.openharmony.cn/pages/v4.0/zh-cn/device-dev/subsystems/subsys-build-component.md
bundle.json内容如下所示。
{
"name": "@ohos/hello",
"description": "Hello world example.",
"version": "3.1",
"license": "Apache License 2.0",
"publishAs": "code-segment",
"segment": {
"destPath": "sample/hello"
},
"dirs": {},
"scripts": {},
"component": {
"name": "hello",
"subsystem": "sample",
"syscap": [],
"features": [],
"adapted_system_type": [ "mini", "small", "standard" ],
"rom": "10KB",
"ram": "10KB",
"deps": {
"components": [],
"third_party": []
},
"build": {
"sub_component": [
"//sample/hello/helloworld:helloworld",
"//sample/hello/mytest:mytest"
],
"inner_kits": [],
"test": []
}
}
}
关键字段解释:
"name": "@ohos/hello" 为部件名称
"destPath": "sample/hello" 为部件路径,建议使用相对路径
"name": "hello" 为部件名称
"subsystem": "sample" 为此部件所属的子系统
"sub_component": [
"//sample/hello/helloworld:helloworld",
"//sample/hello/mytest:mytest"
], 为部件中模块的描述,上述添加了2个模块一个是helloworld,一个是mytest
第五步:OpenHarmony中添加子系统
在build/subsystem_config.json中添加新建的子系统的配置。修改方法可参考:
https://docs.openharmony.cn/pages/v4.0/zh-cn/device-dev/subsystems/subsys-build-subsystem.md。
新增子系统的配置如下所示。
"sample": {
"path": "sample",
"name": "sample"
},
第六步:修改产品配置文件
在vendor/laphone/config.json中添加对应的hello部件,直接添加到原有部件后即可。
{
"subsystem": "sample",
"components": [
{
"component": "hello",
"features": []
}
]
},
关键字段解释:
"subsystem": "sample", #为新建的子系统
"component": "hello", #为新建的部件
编译方式有2种
第一种编译方式
hb set
选择“standard“
然后选择lapphone
执行命令hb build -f
第二种编译方式
执行脚本 ./build.sh --product-name laphone --no-prebuilt-sdk
编译大约需要3到5个小时,如果出现build successful的字符串则表示编译完成。
编译完成的镜像out/laphone/packages/phone/images/laphone_nosec_userdebug.pac
本段落烧录流程来自下列链接
https://laval.csdn.net/65c33699dafaf23eeaee8610.html?login=from_csdn
1.工具下载
下载地址:https://pan.baidu.com/s/1drJz1MgYyZVgBC7L78i-Ew
提取码:84h6
2.工具安装:
驱动安装,根据系统类型进入不同目录,进入后双击DriverSetup.exe:
运行烧录软件,双击UpgradeDownload.exe:
3.加载文件:
打开下载工具,单击工具栏
图标,选择需要烧录的文件包。示例:
4.开始烧录:
手机关机,不插入数据线
单击工具栏图标
按住手机音量加键,插入数据线
工具自动进入烧录模式,如下图所示:
5.烧录完成:
烧录完成后,软件将显示如下内容:
插上手机数据线,打开powershell
输入“hdc shell“指令,
出现“#“命令终端,即已成功进入到手机hdc命令终端(注:hdc连接工具去网上下载)
验证helloworld模块:
hdc命令终端在任意目录下输入命令helloworld后回车,界面打印“Hello World!”,helloworld模块加载并运行成功
验证mytest模块:
hdc命令终端在任意目录下输入命令mytest后回车,界面打印“My Test!”,mytest模块加载并运行成功
到此,我们自定义的子系统、部件、模块均已经成功编译构建到OpenHarmony的项目中。
在确认自己的代码语法没有错误,且文件目录及文件名没有粗心的错误下,偶尔会出现如下编译报错:
解决方式:
不要清理工程,执行编译命令./build.sh --product-name laphone --no-prebuilt-sdk继续编译。
分析原因:
在多线程编译过程中,有些文件可能比依赖的文件要先编译,导致编译失败。针对这种情况,可以尝试不清理工程,继续执行编译命令(如./build.sh --product-name laphone --no-prebuilt-sdk)。如果问题仍然存在,可以检查依赖关系是否正确设置,或者尝试单线程编译来定位问题。
更多推荐
所有评论(0)