摘要:本文介绍下移植开发板时如何适配系统属性部件syspara_lite,并介绍下相关的运行机制原理。

本文分享自华为云社区《openharmony移植案例与原理 - startup子系统之syspara_lite系统属性部件》,作者: zhushy 。

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

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

系统参数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;
}

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);
}

系统参数syspara_lite部件使用例子

下面是系统参数syspara_lite部件使用例子,来自https://gitee.com/openharmony/startup_syspara_lite。⑴处获取设备类型,⑵处获取厂商名称,⑶处获取品牌名称。其他系统属性接口调用的例子类似,详细的接口说明下文会提供。

⑴  char* value1 = GetDeviceType();
printf("Device type =%s\n", value1);
free(value1);
⑵ char* value2 = GetManufacture();
printf("Manufacture =%s\n", value2);
free(value2);
⑶ char* value3 = GetBrand();
printf("GetBrand =%s\n", value3);
free(value3);

系统参数syspara_lite部件接口信息

在文件base\startup\syspara_lite\interfaces\innerkits\native\syspara\include\parameter.h中定义了系统属性的接口。系统属性接口说明如下表所示:

参考站点

点击关注,第一时间了解华为云新鲜技术~

OpenHarmony移植案例与原理:startup子系统之syspara_lite系统属性部件的更多相关文章

  1. 【OpenHarmony移植案例与原理】XTS子系统之应用兼容性测试用例开发

    摘要:本文主要介绍ACTS应用兼容性测试用例开发编译. 本文分享自华为云社区<移植案例与原理 - XTS子系统之应用兼容性测试用例开发>,作者: zhushy . XTS(X Test S ...

  2. OpenHarmony移植:如何适配utils子系统之KV存储部件

    摘要:本文介绍移植开发板时如何适配utils子系统之KV存储部件,并介绍相关的运行机制原理. 本文分享自华为云社区<OpenHarmony移植案例与原理 - utils子系统之KV存储部件> ...

  3. OpenHarmony移植案例: build lite源码分析之hb命令__entry__.py

    摘要:本文介绍了build lite 轻量级编译构建系统hb命令的源码,主要分析了_\entry__.py文件. 本文分享自华为云社区<移植案例与原理 - build lite源码分析 之 hb ...

  4. Python 小案例实战 —— 简易银行存取款查询系统

    Python 小案例实战 -- 简易银行存取款查询系统 涉及知识点 包的调用 字典.列表的混合运用 列表元素索引.追加 基本的循环与分支结构 源码 import sys import time ban ...

  5. 第7.24节 Python案例详解:使用property函数定义属性简化属性访问代码实现

    第7.24节 Python案例详解:使用property函数定义属性简化属性访问代码实现 一.    案例说明 本节将通过一个案例介绍怎么使用property定义快捷的属性访问.案例中使用Rectan ...

  6. elasticsearch 亿级数据检索案例与原理

    版权说明: 本文章版权归本人及博客园共同所有,转载请标明原文出处( https://www.cnblogs.com/mikevictor07/p/10006553.html ),以下内容为个人理解,仅 ...

  7. JDK动态代理案例与原理分析

    一.JDK动态代理实现案例 Person接口 package com.zhoucong.proxy.jdk; public interface Person { // 寻找真爱 void findlo ...

  8. SpringBoot定时任务 - 经典定时任务设计:时间轮(Timing Wheel)案例和原理

    Timer和ScheduledExecutorService是JDK内置的定时任务方案,而业内还有一个经典的定时任务的设计叫时间轮(Timing Wheel), Netty内部基于时间轮实现了一个Ha ...

  9. 彻底理解Toast原理和解决小米MIUI系统上没法弹Toast的问题

    1.Toast的基本使用 Toast在Android中属于系统消息通知,用来提示用户完成了什么操作.或者给用户一个必要的提醒.Toast的官方定义是这样的: A toast provides simp ...

随机推荐

  1. vue iview element-ui兼容IE11浏览器

    首先安装babel-polyfill npm install babel-polyfill --save-dev 入口文件引用,在main.js中引用 import 'babel-polyfill' ...

  2. 使用Swing的GUI编程

    Swing AWT概述 AWT:抽象窗口工具包,提供了一套与本地图形界面进行交互的接口,是Java提供的用来建立和设置Java的图形用户界面的基本工具 Swing以AWT为基础的,尽管Swing消除了 ...

  3. go包管理速通,一篇文章就够了,再也不用担心因为不会导包被辞退

    前言 最近在看一些go语言相关的书,发现了一个有意思的事情:其中一本书最新印刷的版本是2017年3月,而golang包管理的后起之秀go module伴随go1.11于2018年8月诞生--因此,书里 ...

  4. actf2020upload

    actf2020upload .php后缀过滤 1.上传文件,要求后缀为.png/.gif/.jpg 2.抓包,后缀改成.phtml后放行,上传成功,访问地址,根目录下找到flag

  5. Javascript面向对象——创建对象、构造函数的原型

    Javascript面向对象--创建对象.构造函数的原型 其实:JavaScript中的创建类,就是创建一个构造函数,在创建对象时用到new这个关键字, 一.创建对象 1.函数创建对象 functio ...

  6. 源代码管理git地址从http改为https,提交400错误

    推送400错误 cmd 执行 git config --global http.sslVerify false 推送地址,修改http 为 https 就可以正常提交了

  7. 【视频解码性能对比】opencv + cuvid + gpu vs. ffmpeg + cpu

    视频大小:1168856 字节画面尺寸:480*848帧数:275opencv + cuvid + tesla P4, 解码性能:1426.84 fps ffmpeg 4.0 API + [Intel ...

  8. manjora20安装搜狗输入法

    先安装好fcitx和yay yay -S fcitx-sogoupinyin sudo pacman -S base-devel 这是因为需要使用外网,需要配置代理. 注意 manjora20输入法一 ...

  9. python3 连接mysql数据库

    准备工作: 1.在本地虚拟机172.16.0.115上安装mysql,并设置权限如下 mysql> grant all privileges on *.* to root@"%&quo ...

  10. python变量垃圾回收机制的入门使用

    简介: Python是一款高层次的解释性语言:Python对于初学者来说(易于学习)Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单.学习Python的目的就是为了能够 ...