文章目录
- 前言
- 给设备,编写一个简单子系统
- 总结
一、前言
对于应用层的开发,搞了十几年,其实已经有点开发腻的感觉了,翻来覆去,就是调用api,页面实现,最多就再加个性能优化,但对底层了解并不深入。所以,其实不管是android,还是鸿蒙开发,一直都有一个心病,就是怎么进到系统开发中来。
现在智能设备是越来越多,想要做智能设备的开发,那么就需要搞懂系统源码,并再此基础上进行二次开发,以及优化。
这里呢,我是从鸿蒙南向系统开发来着手,首先就是系统源码的下载,还有编译。这些是最基础的,如果这个都搞不定,那么也就没有后面的事了。
我用的是OpenHarmony4.0 源码,编译总共花了4个小时,经过几个魂牵梦绕的夜晚,最终编译成功。编译出来的镜像有3.31个G。
其实呢,系统的开发,本质是要会c/c++,因为要开发驱动,要跟硬件打交道的。还有要搞懂系统源码,包括系统的框架,以及编译相关的内容。接下来,我们就简单的开发一个子系统,对系统的开发有一个简单的概念。
二、简单的子系统开发
先看看,最终的目录和文件如下:

接下来,我们就一步步来实现。
1、创建目录,编写简单的业务代码
在源码的根目录下,比如我的oh40下,然后创建一个sample文件夹,然后再创建hello/src/helloworld.c 这个目录以及文件,其实就一个简单的打印语句函数,输出Hello World!
cpp
#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/include/helloworld.h
一样的操作,创建一个所要依赖的头文件
cpp
#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/BUILD.gn 这个文件很重要,主要是用来生成ninja文件的,也是为了后面我们能够执行命令的关键 (注意点,因为这个编译类似文本的,编译工具不会检查,所以代码一定不能敲错,不然检查起来会很麻烦)
cpp
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 # 是否默认安装(缺省默认不安装),可选
}
4、新建部件配置规则文件
新建sample/hello/bundle.json文件,添加部件sample 的描述
cpp
{
"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"
],
"inner_kits": [],
"test": []
}
}
}
//上面代码分两部分看:前面那部分是描述该部件,所属子系统的信息。第二部分component定义该部件构建的相关配置。sub_component 一定要指明该部件包含的模块
5、修改子系统配置文件
在根目录下,找到 build/subsystem_config.json,这个文件包含了很多子系统,因为我们要添加自己的子系统,所以找到最后位置,添加我们的子系统。
cpp
"sample": {
"path": "sample",
"name": "sample"
}
//最前面有个逗号,自己要加上
6、修改产品配置文件。
因为我用的是4.0的源码进行编译的,而且是rk3568的设备,所以直接根目录下去找到这个文件 vendor/hihope/rk3568/config.json
这里有很多部件,我们只要在最后,添加对应我们自己的hello部件即可
cpp
{
"subsystem": "sample",
"components": [
{
"component": "hello",
"features": []
}
]
}
三、编译
1、执行编译命令
cpp
./build.sh --product-name rk3568 --ccache
2、编译成功
编译成功会输出下面的提示

3、编译之后输出的镜像
编译之后的文件都存放在根目录的out 对应的设备下面,比如我的是out/rk3568下面, 镜像文件就在 out/rk3568/packages/phone/images
四、烧录
1、下载rk3568设备的烧录工具,以及usb驱动

导入镜像,然后执行hdc target boot loader 重启设备,能够识别设备之后,点击设备分区表,然后点击执行,当右边出现,下载完成,紧接着看到设备重启,也就烧录成功了。
五、运行
用MobaXterm 连接串口,这个时候会不断输出系统的日志,这个时候只要输入 helloworld 回车,就会看到Hello World! 的字样,这样就说明我们的子系统正确运行了。
注意:helloworld 输入的时候会被打断,可以通故dmesg -n 1 然后回车,将日志停止,这样就能比较好的输入命令了,下面是正常执行后的效果:

以上就是全部,制作简单子系统的全部过程。
最后献上我的个人v,专属终身顾问,解答关于鸿蒙相关的东西,包括项目中的问题,还有最新的技术点,快速开发,抢在前头。hmssz1
技术迭代很快,不要在一个问题上拔不出来,找到专业的人,快速的解决,作为程序员时间是最宝贵的,不要自己蒙头苦干,等你搞懂了,这个技术已经过时了。
总结
1、介绍鸿蒙南向开发背景 2、简单的子系统开发过程 3、最后成功运行子系统
如果对你有一点点帮助,那是值得高兴的事情。:)
我的csdn:blog.csdn.net/shenshizhon...