欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 文化 > 移植案例与原理 - startup子系统之syspara_lite系统属性部件

移植案例与原理 - startup子系统之syspara_lite系统属性部件

2024/10/23 21:37:19 来源:https://blog.csdn.net/u012165769/article/details/142143937  浏览:    关键词:移植案例与原理 - startup子系统之syspara_lite系统属性部件

往期知识点记录:

  • 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
  • startup子系统之syspara_lite系统属性部件 (1)
  • startup子系统之syspara_lite系统属性部件 (2)
  • startup子系统之bootstrap_lite服务启动引导部件(1)
  • startup子系统之bootstrap_lite部件 (2)
  • utils子系统之file文件操作部件
  • utils子系统之KV存储部件 (1)
  • utils子系统之KV存储部件 (2)
  • utils子系统之KV存储部件 (3)
  • build lite配置目录全梳理
  • build lite编译构建过程
  • XTS子系统之应用兼容性测试用例开发
  • XTS子系统之应用兼容性测试套件(1)
  • XTS子系统之应用兼容性测试套件(2)
  • HPM包描述文件bundle.json
  • build lite源码分析 之 hb命令__main__.py
  • 持续更新中……

系统属性部件syspara_lite负责提供获取与设置操作系统相关的系统属性,包括默认系统属性、OEM厂商系统属性和自定义系统属性。为满足OpenHarmony产品兼容性规范,产品解决方案需要实现获取设备信息的接口,如:产品名、品牌名、厂家名等,同时提供设置/读取系统属性的接口。本文介绍下移植开发板时如何适配系统属性部件syspara_lite,并介绍下相关的运行机制原理。系统属性部件syspara_lite包含系统参数特性syspara_lite和token。系统属性部件syspara_lite定义在build\lite\components\startup.json。源代码目录如下:

base/startup/syspara_lite/    # 系统属性部件
├── frameworks                # 系统属性部件源文件目录
├── hals                      # 系统属性部件硬件抽象层头文件目录
└── interfaces                # 系统属性部件对外接口目录

1、系统参数syspara适配

适配启动恢复子系统startup的syspara_lite部件的一个实例vendor\bestechnic\display_demo\config.json的代码片段如下,⑴处的配置项enable_ohos_startup_syspara_lite_use_posix_file_api设置为true,下文通过分析syspara_lite部件的代码来解释。

  {"product_name": "display_demo",......"subsystems": [{......{"subsystem": "startup","components": [{"component": "bootstrap_lite"},{"component": "syspara_lite","features": [
⑴           "enable_ohos_startup_syspara_lite_use_posix_file_api = true"]}]},......],"vendor_adapter_dir": "","product_adapter_dir": "//vendor/bestechnic/display_demo/hals",......
}

我们知道,syspara_lite部件支持获取和设置操作系统的参数,当设置系统参数时,系统参数会最终写到文件中进行持久化保存。在轻量系统中,文件操作相关接口有POSIX接口与HalFiles接口这两套实现。POSIX文件系统接口代码位置kernel\liteos_m\kal\libc\musl\fs.c,HalFiles文件系统接口位置为utils\native\lite\file\src\file_impl_hal\file.c。当对接内核的文件系统,采用POSIX相关的接口时,需要在features字段中需要增加enable_ohos_startup_syspara_lite_use_posix_file_api = true。如果对接HalFiles相关的接口,则无须修改。enable_ohos_startup_syspara_lite_use_posix_file_api默认为false,定义在文件base\startup\syspara_lite\frameworks\parameter\config.gni。我们通过看下编译配置文件来了解下实现的原理机制,打开文件base\startup\syspara_lite\frameworks\parameter\src\BUILD.gn,片段如下。

⑴处解释了上文的配置参数enable_ohos_startup_syspara_lite_use_posix_file_api。⑵处依赖产品解决方案中的适配的sys_param实现代码。ohos_product_adapter_dir是产品解决方案config.json中的配置项,该配置项一遍设置为"hals"。sys_param实现代码文件的路径一遍为"hals/utils/sys_paramn/hal_sys_param.c",并且同级目录的BUILD.gn文件中的静态库名称必须为hal_sysparam。⑶处表示如果需要使用安全函数,则需要配置项enable_ohos_startup_syspara_lite_use_thirdparty_mbedtls设置为true。⑷处设置一些配置项宏,这些属于构建类别的参数。

if (ohos_kernel_type == "liteos_m") {static_library("sysparam") {include_dirs = ["//base/startup/syspara_lite/interfaces/kits","//utils/native/lite/include","//base/startup/syspara_lite/frameworks/parameter/src","//base/startup/syspara_lite/hals","//third_party/mbedtls/include",]sources = [ "parameter_common.c" ]
⑴  if (enable_ohos_startup_syspara_lite_use_posix_file_api) {sources += [ "param_impl_posix/param_impl_posix.c" ]} else {sources += [ "param_impl_hal/param_impl_hal.c" ]}⑵  deps = [ "$ohos_product_adapter_dir/utils/sys_param:hal_sysparam" ]
⑶  if (enable_ohos_startup_syspara_lite_use_thirdparty_mbedtls) {deps += [ "//third_party/mbedtls:mbedtls" ]}if (enable_ohos_startup_syspara_lite_use_posix_file_api) {deps += [ "//third_party/bounds_checking_function:libsec_static" ]}defines = [
⑷    "INCREMENTAL_VERSION=\"${ohos_version}\"","BUILD_TYPE=\"${ohos_build_type}\"","BUILD_USER=\"${ohos_build_user}\"","BUILD_TIME=\"${ohos_build_time}\"","BUILD_HOST=\"${ohos_build_host}\"","BUILD_ROOTHASH=\"${ohos_build_roothash}\"","USE_MBEDTLS","DATA_PATH=\"${config_ohos_startup_syspara_lite_data_path}\"",]}
}

看个产品解决方案的实际例子,vendor\bestechnic\display_demo\hals\utils\sys_param\BUILD.gn的代码如下,⑴处的静态库的名字是不能随意更改的,见上文解释。

⑴  static_library("hal_sysparam") {sources = [ "hal_sys_param.c" ]include_dirs = [ "//base/startup/syspara_lite/hals" ]defines = ["INCREMENTAL_VERSION=\"${ohos_version}\"","BUILD_TYPE=\"${ohos_build_type}\"","BUILD_USER=\"${ohos_build_user}\"","BUILD_TIME=\"${ohos_build_time}\"","BUILD_HOST=\"${ohos_build_host}\"","BUILD_ROOTHASH=\"${ohos_build_roothash}\"",]}

文件vendor\bestechnic\display_demo\hals\utils\sys_param\hal_sys_param.c实现接口文件base\startup\syspara_lite\hals\hal_sys_param.h中声明的函数,如下所示,主要包含设备厂商信息,软件版本信息,构建信息等。

const char* HalGetDeviceType(void);
const char* HalGetManufacture(void);
const char* HalGetBrand(void);
const char* HalGetMarketName(void);
const char* HalGetProductSeries(void);
const char* HalGetProductModel(void);
const char* HalGetSoftwareModel(void);
const char* HalGetHardwareModel(void);
const char* HalGetHardwareProfile(void);
const char* HalGetSerial(void);
const char* HalGetBootloaderVersion(void);
const char* HalGetAbiList(void);
const char* HalGetDisplayVersion(void);
const char* HalGetIncrementalVersion(void);
const char* HalGetBuildType(void);
const char* HalGetBuildUser(void);
const char* HalGetBuildHost(void);
const char* HalGetBuildTime(void);
int HalGetFirstApiVersion(void);

在适配HalGetSerial接口时,开发板不像产线生产过程那样,会写入一个具体的序列号Serial Number,因而需要确定一个数据对开发板进行唯一标识。vendor\bestechnic\display_demo\hals\utils\sys_param\hal_sys_param.c中提供了一种方法,采用WiFi Mac地址进行适配。

const char* HalGetSerial(void)
{char macAddr[ETH_ALEN];// as devboard has no production serial number, we just// use wifi mac address as device serial number.if (serialNumber[0] == STR_END_FLAG) {extern int bwifi_get_own_mac(u8 *addr);bwifi_get_own_mac(macAddr);int j = 0;for (int i = 0; i < ETH_ALEN; i++) {u8 lowFour, highFour;highFour = (macAddr[i] & MAC_HIGH_MASK) >> MAC_BITS;serialNumber[j] = Hex2Char(highFour);j++;lowFour = macAddr[i] & MAC_LOW_MASK;serialNumber[j] = Hex2Char(lowFour);j++;}}return serialNumber;
}

2、Token令牌适配

在文件base\startup\syspara_lite\hals\hal_token.h中定义令牌相关的接口声明,包含写令牌,获取AcKey,获取产品编码和产品键值。在移植开发板时,需要实现这些接口。

在base\startup\syspara_lite\frameworks\token\BUILD.gn文件中,查看令牌如何编译的,以LiteOS-M为例,片段为:
⑴处可以看出编译使用的源文件是"src/token_impl_hal/token.c",对于linux和liteos-a内核使用的源文件是"src/token_impl_posix/token.c"。"token.c"文件代码很简单,判断下参数然后调用产品解决方案中的适配函数,比如函数ReadToken()会调用HalReadToken()函数。

⑵处需要注意,这里依赖的就是产品解决方案适配的token实现代码。ohos_product_adapter_dir是产品解决方案config.json中的配置项,该配置项一遍设置为"hals"。token实现代码文件的路径一遍为"hals/utils/token/hal_token.c",并且同级目录的BUILD.gn文件中的静态库名称必须为hal_token_static。⑶处表示token部件由特性token_static组成。

    if (ohos_kernel_type == "liteos_m") {static_library("token_static") {
⑴      sources = [ "src/token_impl_hal/token.c" ]include_dirs = ["//base/startup/syspara_lite/interfaces/kits","//utils/native/lite/include","//base/hiviewdfx/hilog_lite/interfaces/native/kits/hilog_lite","//base/startup/syspara_lite/hals",]⑵      deps = [ "$ohos_product_adapter_dir/utils/token:hal_token_static" ]}}lite_component("token") {features = []if (ohos_kernel_type == "liteos_a" || ohos_kernel_type == "linux") {features += [ ":token_shared" ]}if (ohos_kernel_type == "liteos_m") {
⑶      features += [ ":token_static" ]}}

看个产品解决方案的实际例子,vendor\bestechnic\display_demo\hals\utils\token\BUILD.gn的代码如下,⑴处的静态库的名字是不能随意更改的,见上文解释。

⑴  static_library("hal_token_static") {sources = [ "hal_token.c" ]include_dirs = ["//base/startup/syspara_lite/hals","//utils/native/lite/include",]deps = []}

文件vendor\bestechnic\display_demo\hals\utils\token\hal_token.c中的令牌实现代码片段如下,当前均为空实现,没有实际使用起来。

static int OEMReadToken(char *token, unsigned int len)
{// OEM need add here, read token from device(void)(token);(void)(len);return EC_SUCCESS;
}
......
int HalReadToken(char *token, unsigned int len)
{if (token == NULL) {return EC_FAILURE;}return OEMReadToken(token, len);
}

小结

本文介绍了startup子系统之syspara系统属性部件的移植适配案例及原理。

经常有很多小伙伴抱怨说:不知道学习鸿蒙开发哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?

为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

在这里插入图片描述

《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN/733GH/overview

如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……

开发基础知识:

1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……

在这里插入图片描述

基于ArkTS 开发

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

在这里插入图片描述

鸿蒙开发面试真题(含参考答案):https://gitcode.com/HarmonyOS_MN/733GH/overview

在这里插入图片描述

OpenHarmony 开发环境搭建

图片

《OpenHarmony源码解析》:https://gitcode.com/HarmonyOS_MN/733GH/overview

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……
  • 系统架构分析
  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

图片

OpenHarmony 设备开发学习手册:https://gitcode.com/HarmonyOS_MN/733GH/overview

图片
在这里插入图片描述