如图所示,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两个可执行程序文件,执行后输出信息如下: