OpenHarmony系统Init启动与Native服务运行
参考文章简述
启动后自动运行应用参考资料:
引导启动配置文件
服务管理
仓库同目录下还有 jobs 管理文档
OpenHarmony启动子系统介绍:
由内核创建第一个用户态进程用来跑init程序。init组件负责处理从内核加载第一个用户态进程开始,到第一个应用程序启动之间的系统服务进程启动过程。启动恢复子系统除负责加载各系统关键进程之外,还需在启动的同时设置其对应权限,并在子进程启动后对指定进程实行保活(若进程意外退出要重新启动),对于特殊进程意外退出时,启动恢复子系统还要执行系统复位操作。
启动配置文件(init.cfg)在全量SDK源码位置:base/startup/init/services/etc/如下图

开机自启动应用:
- services:定义启动什么进程,主要解决的是进程是什么、在哪里、以什么权限运行、如何管理生命周期。详见服务管理参考资料
- jobs:定义启动过程中执行什么命令,一组命令集合,可以通过 jobs 中定义的命令来启动 services 中配置好的服务
- groups:控制不同启动模式下,允许执行的服务和命令;设备启动组由 Bootloader 传递的
bootgroup参数(或相应的 misc 存储分区中保存的启动模式信息)决定;init 根据选择结果读取对应的 group 配置,再决定允许哪些 jobs 和 services 启动。
groups 在源码中的位置如下:

详细内容见引导启动配置文件参考资料,按照文章规则编写.cfg
1.构建时在源文件目录下的BUILD.gn中编写构建规则包括指定可执行文件的安装位置,以 watchdog 为例;
base/startup/iniit是OpenHarmony 启动初始化子系统中 init 部件的源码仓库目录,如果是自己编写的应用源码不一定需要放到这个位置,只要放到合适的为位置,在源码目录中的BUILD.gn编写好构建规则,指定安装路径即可,构建规则内容可以参考下图
构建规则如下:

ohos对gn封装后的默认路径规则如下:

2.编写 .cfg ,编写规则详见 服务管理

3.服务进程及其配置文件创建完成后,需要在对应模块的bundle.json文件中添加其build路径,如下,它没有直接把 watchdog 的构建目标写进去,而是通过 GN 的 group() 进行多层依赖组织

自编写应用 Init 示例
init服务流程框图

示例中自定义子系统及组件相关内容在OpenHarmony源码构建编译链路资料汇总
1.目录结构示例
source_6.1_LTS/
│
├── build/
│ └── subsystem_config.json # 注册 ecg 子系统
│
├── vendor/
│ └── hihope/
│ └── dayu210/
│ ├── config.json # 产品配置
│ │
│ └── ecg/
│ └── ecg_inference/ # ECG 部件
│ ├── bundle.json
│ ├── BUILD.gn
│ ├── ecg_inference.cfg
│ ├── include/
│ │ └── ecg_inference.h
│ └── src/
│ └── main.cpp
2.编写 BUILD.gn 示例
在 ecg_inference/BUILD.gn 中定义两个构建目标,分别是源码和init服务;上面提到过ohos_executable()默认安装目录为system/bin;ohos_prebuilt_etc() 模板主要用于将已经存在的配置文件或其他预置文件安装到指定的系统镜像目录中。
import("//build/ohos.gni")
# 1. 编译 ECG 服务程序
ohos_executable("ecg_inference") {
sources = [
"src/main.cpp",
]
include_dirs = [
"include",
]
install_enable = true
install_images = [ "system" ]
module_install_dir = "system/bin"
part_name = "ecg_inference"
subsystem_name = "ecg"
}
# 2. 安装 init 服务配置文件
ohos_prebuilt_etc("ecg_inference.cfg") {
source = "ecg_inference.cfg"
relative_install_dir = "init"
install_images = [ "system" ]
part_name = "ecg_inference"
subsystem_name = "ecg"
}
最终预期安装位置:
/system/bin/ecg_inference
/system/etc/init/ecg_inference.cfg
这里的 part_name 和 subsystem_name 必须与后面 bundle.json 中的部件和子系统名称对应
3.编写 ecg_inference.cfg 示例,字段要求参照官方的服务管理文档
这个文件负责告诉 init 如何启动 ECG 服务
{
"services": [
{
"name": "ecg_inference",
"path": [
"/system/bin/ecg_inference"
],
"uid": "system",
"gid": [
"system"
],
"once": 0,
"start-mode": "normal"
}
]
}
**4.编写 bundle.json 示例,bundle.json相关内容和新建子系统、部件中介绍 **
{
"name": "@ohos/ecg_inference",
"description": "ECG inference native service",
"version": "6.1.0",
"license": "Apache License 2.0",
"publishAs": "code-segment",
"segment": {
"destPath": "vendor/hihope/dayu210/ecg/ecg_inference"
},
"dirs": {},
"scripts": {},
"component": {
"name": "ecg_inference",
"subsystem": "ecg",
"syscap": [],
"features": [],
"adapted_system_type": [
"standard"
],
"rom": "待评估",
"ram": "待评估",
"deps": {
"components": [],
"third_party": []
},
"build": {
"group_type": {
"base_group": [],
"fwk_group": [],
"service_group": [
"//vendor/hihope/dayu210/ecg/ecg_inference:ecg_inference",
"//vendor/hihope/dayu210/ecg/ecg_inference:ecg_inference.cfg"
]
}
}
}
}
build字段内容表示把前面 BUILD.gn 定义的两个目标都纳入 ECG 部件的构建,路径格式://目录路径:GN目标名称
5.注册 ecg 子系统示例
由于是新建的子系统所以要在build/subsystem_config.json中添加一下内容用于注册新建的子系统
"ecg": {
"path": "vendor/hihope/dayu210/ecg",
"name": "ecg",
"dir": "vendor"
}
6.将 ECG 部件加入产品配置
在vendor/hihope/dayu210/config.json中添加
{
"subsystem": "ecg",
"components": [
{
"component": "ecg_inference",
"features": []
}
]
}
最后即可执行编译命令在输出产物中找到可执行文件和.cfg文件
更多推荐

所有评论(0)