鸿蒙南向开发 编写一个简单子系统

文章目录

  • 前言
  • 给设备,编写一个简单子系统
  • 总结

一、前言

对于应用层的开发,搞了十几年,其实已经有点开发腻的感觉了,翻来覆去,就是调用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...

我的掘金:juejin.cn/user/428855...

相关推荐
浪里行舟1 分钟前
一网打尽 Promise 组合技:race vs any, all vs allSettled,再也不迷糊!
前端·javascript·vue.js
Antonio91518 分钟前
【网络编程】WebSocket 实现简易Web多人聊天室
前端·网络·c++·websocket
tianzhiyi1989sq2 小时前
Vue3 Composition API
前端·javascript·vue.js
今禾2 小时前
Zustand状态管理(上):现代React应用的轻量级状态解决方案
前端·react.js·前端框架
用户2519162427112 小时前
Canvas之图形变换
前端·javascript·canvas
今禾2 小时前
Zustand状态管理(下):从基础到高级应用
前端·react.js·前端框架
gnip2 小时前
js模拟重载
前端·javascript
Naturean2 小时前
Web前端开发基础知识之查漏补缺
前端
curdcv_po2 小时前
🔥 3D开发,自定义几何体 和 添加纹理
前端
单身汪v2 小时前
告别混乱:前端时间与时区实用指南
前端·javascript