OpenHarmony自定义子系统、部件与模块

在这里插入图片描述
如图所示,OpenHarmony系统源码中,大体上按照不同种类的功能分成多个子系统,然后一个子系统内部进一步在同类功能上的差异性划分成一个或多个部件,也就是说一个部件表示一个具体功能的源码集合。最后一个部件的源码再划分成一个或多个模块,一个模块可以是静态库、动态库或可执行程序等。
例如,在系统的multimedia子系统的描述:
在这里插入图片描述
multimedia子系统所属部件的描述:
在这里插入图片描述
其中media_lite部件所属模块的描述:
在这里插入图片描述
每个模块最终由目录下的BUILD.gn文件配置编译,指定编译目标、由哪些源文件组成、头文件所在路径等。

大体清楚子系统、部件与模块的关系后,在OpenHarmony系统源码中进行自定义操作,目标:增加了一个aSubSys子系统,此子系统中有一个myhello部件,然后此部件由mytest与mytest2模块组成。如图所示:
在这里插入图片描述
1. 增加aSubSys子系统的声明
子系统配置参考:https://docs.openharmony.cn/pages/v5.0/zh-cn/device-dev/subsystems/subsys-build-subsystem.md
在OpenHarmony源码目录下创建aSubSys文件夹,用于作为子系统的根目录。然后打开build/subsystem_config.json,在文件尾增加aSubSys子系统的描述如下:
在这里插入图片描述
其中"path"项用于指定子系统在OpenHarmony系统源码中的目录路径。
2. 编译与使用子系统
产品子系统配置参考:https://docs.openharmony.cn/pages/v5.0/zh-cn/device-dev/subsystems/subsys-build-product.md
子系统声明后,并不表示在OpenHarmony系统中产生作用,此子系统是否生效,还需要在编译产品目标的配置文件,指定使用此子系统与子系统的部件组成。
如编译目标为ipcamera_hispark_taurus@hisilicon,则修改vendor/hisilicon/hispark_taurus/config.json产品配置文件
如编译目标为qemu_small_system_demo@ohemu,则修改vendor/ohemu/qemu_small_system_demo/config.json产品配置文件
增加子系统的描述如下:
在这里插入图片描述
其中"subsystem"项指定使用子系统,"components"项用于指定此子系统的部件组成。
3. 在子系统中增加部件
部件配置参考:https://docs.openharmony.cn/pages/v5.0/zh-cn/device-dev/subsystems/subsys-build-component.md
在aSubSys目录下创建任意名的一个文件夹,如mydir。然后在此文件夹中创建bundle.json文件描述myhello部件的模块组成,文件内容如下:

{
    "name": "@ohos/myapp",
    "description": "myapp samples.",
    "version": "3.1",
    "license": "Apache License 2.0",
    "publishAs": "code-segment",
    "segment": {
        "destPath": "aSubSys/mydir"  #指定部件路径
    },
    "dirs": {},
    "scripts": {},
    "component": {
        "name": "myhello",     #指定部件名
        "subsystem": "aSubSys", #指定所属子系统
        "syscap": [],
        "features": [],
        "adapted_system_type": [
            "small"  #指定支持OpenHarmony系统的类型
        ],
        "rom": "",
        "ram": "",
        "deps": {
            "components": [
            ],
            "third_party": [
            ]
        },
        "build": {
            "sub_component": [  #指定部件的模块组成
                "//aSubSys/mydir/mytest:mytest",  #指定模块BUILD.gn文件的路径:编译目标
                "//aSubSys/mydir/mytest2:mytest2"
            ],
            "inner_kits": [],
            "test": []
        }
    }
}

4. 在部件中增加mytest模块
模块配置参考:https://docs.openharmony.cn/pages/v5.0/zh-cn/device-dev/subsystems/subsys-build-module.md
在aSubSys/mydir目录下创建mytest文件夹,然后再在mytest文件夹里创建main.c源文件,源文件内容如下:

#include <stdio.h>


int main(int argc, char *argv[])
{
    printf("hello mytest\n");
    return 0;
}

然后在mytest文件夹中再创建BUILD.gn编译配置文件,并输入文件内容如下:

import("//build/ohos.gni")
ohos_executable("mytest") { #指定编译生成一个mytest可执行程序
  sources = ["main.c"] #指定源文件组成
  include_dirs = []   #指定头文件路径
  part_name = "myhello"  #指定所属部件名
}

5. 在部件中增加mytest2模块
在aSubSys/mydir目录下创建mytest2文件夹,然后再在mytest2文件夹里创建main.c源文件,源文件内容如下:

#include <stdio.h>


int main(int argc, char *argv[])
{
    printf("hello mytest222\n");
    return 0;
}

然后在mytest2文件夹中再创建BUILD.gn编译配置文件,并输入文件内容如下:

import("//build/ohos.gni")
ohos_executable("mytest2") { #指定编译生成一个mytest2可执行程序
  sources = ["main.c"] #指定源文件组成
  include_dirs = []   #指定头文件路径
  part_name = "myhello"  #指定所属部件名
}

6. 测试与使用
重新编译OpenHarmony系统源码,编译完成时可查看到子系统的编译信息,如图所示:
在这里插入图片描述
系统运行后,可在bin目录下查看到mytest与mytest2两个可执行程序文件,执行后输出信息如下:
在这里插入图片描述

### OpenHarmony自定义子系统部件模块的开发 #### 1. 子系统的创建配置 在 OpenHarmony 的开发框架中,子系统是一个逻辑上的划分单元,用于管理一组功能相关的部件。要向 OpenHarmony 添加一个新的子系统,开发者需要遵循特定的流程和规则。 - 创建新的子系统目录并将其放置于 `base` 或其他合适的顶层目录下[^1]。 - 编辑或新增 `BUILD.gn` 文件来声明该子系统及其依赖项。例如: ```gn import("//build/config/harmonyos/subsystem.gni") subsystem("custom_subsystem") { components = [ ":component_a", ":component_b" ] } ``` 上述代码片段展示了如何通过 GN 构建工具定义一个名为 `custom_subsystem` 的新子系统,并指定其包含哪些部件。 #### 2. 部件的设计集成 部件是构成子系统的具体实现单位,通常对应某个独立的功能模块或者服务接口集合。 - 新增部件时需同步更新所属子系统的 `BUILD.gn` 文件以注册此部件。 - 每个部件都应具备自身的描述性元数据文件——即位于部件根路径下的 `bundle.json`[^3]。以下是标准模板的一个例子: ```json { "name": "example_component", "version": "1.0.0", "type": "library", "description": "An example component demonstrating the structure of a HarmonyOS module." } ``` 这里,“name”字段表示部件名称;“version”标明版本号;而 “type” 则指明了它是库(library)还是可执行程序(executable)。 #### 3. 模块的具体化处理 模块代表更细粒度的操作实体,可以看作是组成部件的基本构件之一。 - 对于每一个模块而言,同样也需要维护一份专属的 `BUILD.gn` 来界定它的属性及关联资源。 - 如果涉及到外部依赖,则务必清晰罗列出来以便正确解析链接关系[^2]。 下面给出了一段关于 ArkTS 类型支持扩展的例子作为参考: ```typescript declare namespace myCustomNamespace { export class CustomClass { constructor(); customMethod(param:string): void; } } // Example usage within your application code. let obj = new myCustomNamespace.CustomClass(); obj.customMethod('Hello, World!'); ``` 以上示例体现了基于 TypeScript (ArkTS) 进行业务逻辑封装的一种方式。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值