如何向OpenHarmony中编译构建自己的子系统、部件和模块

 

 

目录

一、       引言... 1

二、       产品、子系统、部件和模块的关系... 2

三、       编译构建流程... 3

四、       添加步骤... 3

第一步:安装编译环境... 4

第二步:创建helloworld模块... 4

第三步:创建mytest模块... 6

第四步:创建hello部件... 7

第五步:OpenHarmony中添加子系统... 9

第六步:修改产品配置文件... 9

五、       编译... 10

第一种编译方式... 10

第二种编译方式... 10

六、       烧录... 11

1.工具下载... 11

2.工具安装:... 11

3.加载文件:... 12

4.开始烧录:... 13

5.烧录完成... 13

七、       运行验证... 13

验证helloworld模块:... 14

验证mytest模块:... 15

八、       编译过程中可能会出现的报错... 15

 

 

在OpenHarmony开发的复杂过程中,产品、子系统、部件和模块等概念扮演着至关重要的角色。它们不仅定义了OpenHarmony的结构,还影响了OpenHarmony的编译、打包以及最终的发布。本文档旨在详细阐述这些概念之间的关系,以及如何在OpenHarmony中添加自己的子系统、部件和模块。

 

 

产品子系统部件模块关系

 

                                  图1

   要编译构建自己的子系统、部件和模块,首先要了解它们的概念和关系

图1展示了产品、子系统、部件和模块之间的关系。通过这张图,我们可以清晰地看到它们之间的层次结构和依赖关系

 

 

  1. 产品:

产品是整个软件开发项目的最终成果,它是面向用户的完整软件。产品通常由多个子系统组成,每个子系统负责实现产品的某个特定功能或特性。

 

  1. 子系统

子系统是产品的组成部分,它是某个路径下所有部件的集合。一个产品可以包含多个子系统。子系统通常负责实现产品的某个相对独立的功能模块,例如用户界面、数据库管理、驱动等。

 

  1. 部件:

部件是子系统的组成部分,它是由多个模块组成的集合。一个部件只能归属于一个子系统,而一个模块只能归属于一个部件。部件可以在不同的产品中实现有差异,通过变体或者特性(feature)来实现这种差异。例如,一个部件可能包含多个模块,这些模块在不同的产品配置中可能有不同的实现或配置。

 

  1. 模块:

模块是编译子系统的一个编译目标,也是部件的组成部分。模块通常包含了实现某个特定功能的代码和数据。在编译过程中,模块会被单独编译,并最终被打包到产品中。部件也可以是编译目标,这意味着整个部件的代码和数据会被一起编译和打包。

 

 

模块添加流程

 

前面讲述的都是编译构建的一些原理,接下来正式开始讲述如何向OpenHarmony中添加自己的子系统、部件和模块。

 

下方将展示如何在开发者手机上运行自己的模块,其中包括新建2个模块、编译、烧写、运行等步骤,最终输出“Hello World!”和 “My test!”。

 

  1. 拉取openharmony开发者手机项目代码,在代码根目录创建sample子系统文件夹。
  2. 在子系统sample目录下创建hello部件文件夹及部件配置文件bundle.json。
  3. hello部件文件夹中创建helloworld模块文件夹和mytest模块文件夹。
  4. helloworld文件夹中创建helloworld源码目录,构建文件BUILD.gn。
  5. 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)。如果问题仍然存在,可以检查依赖关系是否正确设置,或者尝试单线程编译来定位问题。

 

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐