1. 系统参数概述

1.1 功能简介

OpenHarmony 系统参数为各系统服务提供简单易用的键值对访问接口,使得各个系统服务可以通过系统参数进行业务功能的配置和状态管理。
(系统参数同android中的系统参数是类似的,命令有所差异)

最常用的命令

hdc shell param get 系统参数键
hdc shell param set 系统参数键  系统参数值

或者进入hdc shell
param get 系统参数键
param set 系统参数键  系统参数值

甚至你还可以直接进入param shell模式(小众但是个人觉得还是比较好用的):
hdc shell     #进入shell
然后param shell   #进入Param面板
然后直接get/set
比如:
watch persist.sys.usb.config
get persist.sys.usb.config
set persist.sys.usb.config mtp
set persist.sys.usb.config  hdc
退出param shell模式直接exit即

param shell面板示例:
在这里插入图片描述

1.2 基本操作原语

系统参数支持以下基本操作:

  • get:获取系统参数的值
  • set:设置系统参数的值
  • wait:同步等待系统参数的值变更
  • watch:异步观察系统参数的值变更

2. 系统参数定义与分类

2.1 系统参数命名规范

系统参数名称采用点分格式,由多段组成,每一段可以由字母、数字、下划线组成,总长度不超过96字节。

命名格式示例

[const|persist].$sub_system.$desc

其中 $sub_system 为子系统或模块名称,$desc 为参数描述字符。

2.2 系统参数分类

系统参数分为三大类:

类别前缀说明值最大长度
常量参数const.常量参数,一旦赋值后续不会再变更4096字节
可写参数其它可写参数,重启后丢失96字节
可持久化persist.可写并可持久化保存参数,重启后不会丢失96字节

2.3 参数值类型

系统参数支持三种赋值方式:

  • 字符串const.product.name=OHOS-PRODUCT
  • 数字const.os.version.api=26
  • 布尔const.telephony.enable=false(支持0,1,false,true)

2.4常见的系统参数

命令说明
param get const.product.cpu.abilist查看系统支持的 CPU 架构,如 arm64-v8a
param get const.product.developmentmode查看是否处于开发模式
param get persist.sys.hilog.debug.on查看是否开启 hilog 调试日志,返回 truefalse
param get debug.init.log.level查看 init 日志级别,如 INFODEBUG
param get startup.bootanim.enable查看是否启用开机动画
param set persist.sys.usb.config hdc是否开启HDC usb设备识别
param persist.init.bootevent.enable #true开机启动

3. 系统参数权限管理

3.1 默认权限

当系统参数没有定义任何DAC、MAC权限时,默认权限为:

DAC UserDAC GroupDAC UGOMAC SELinux Label
rootroot775default_param

不同进程对默认权限参数的访问行为:

操作系统Native进程系统应用进程三方应用进程
get允许允许允许
watch允许允许允许
set不允许不允许不允许

3.2 DAC访问控制

通过 .para.dac 文件配置自主访问控制,位于 /base/startup/init/services/etc/param/ohos.para.dac

配置示例

const.product.              = root:root:0775
persist.init.               = root:root:0775
startup.appspawn.           = root:root:0750
startup.uevent.             = ueventd:ueventd:0775

DAC信息通过 ":" 分三段描述:user:group:UGO规则

3.3 MAC访问控制(SELinux)

添加selinux标签步骤

  1. 在parameter.te中定义标签
type servicectrl_param, parameter_attr;
  1. 在parameter_contexts中关联参数前缀
ohos.servicectrl.           u:object_r:servicectrl_param:s0
  1. 给init授权
allow servicectrl_param tmpfs:filesystem associate;
allow init servicectrl_param:file { map open read relabelto relabelfrom };
  1. 设置写权限
allow { init samgr hdf_devmgr } servicectrl_param:parameter_service { set };
  1. 设置读权限
allow { xxx } servicectrl_param:file { map open read };

权限设置建议

  • 公开只读参数:使用 default_param
  • 可写参数:增加 {component}_writable_param 标签
  • 内部隐私参数:增加 {component}_private_param 标签

4. 系统参数标签与内存管理

4.1 标签文件大小配置

每个标签默认分配1K内存,能存放5个左右的系统参数。如需扩展,在 ohos.para.size 文件中配置:

配置示例

devinfo_public_param=30720
hilog_param=40960

默认系统参数的共享内存大小为80KB。

4.2 共享内存映射

init会根据系统参数标签在 /dev/parameters/ 目录下创建对应的共享内存映射文件:

-rwxr-xr-- 1 root root 30720 2017-08-10 16:22 u:object_r:default_param:s0
-rwxr-xr-- 1 root root  1024 2017-08-10 16:22 u:object_r:devinfo_private_param:s0

4.3 参数加载顺序

系统参数按以下顺序加载:

  1. 内核参数/proc/cmdline(转换为 ohos.boot.xxx 形式)
  2. OS系统参数/system/etc/param/ohos_const/*.para
  3. vendor参数/vendor/etc/param/*.para
  4. system参数/system/etc/param/*.para(已存在参数忽略)
  5. persist参数/data/parameters/(覆盖默认参数)

5. 开发指南

5.1 系统参数定义文件

系统参数定义文件后缀名为 .para

示例内容

const.product.name=OHOS-PRODUCT
const.os.version.api=26
const.telephony.enable=false|true

注意:系统参数值不支持注释及换行。

5.2 配置文件安装

标准系统安装方法

ohos_prebuilt_para("ohos.para") {
    source = "//base/startup/init/services/etc/ohos.para"
    part_name = "init"
    module_install_dir = "etc/param"
}

5.3 C/C++接口使用

基本操作示例

// 设置和获取参数
char key1[] = "rw.sys.version";
char value1[] = "10.1.0";
int ret = SetParameter(key1, value1);

char valueGet1[128] = {0};
ret = GetParameter(key1, "version=10.1.0", valueGet1, 128);

// 获取设备信息
char* deviceType = GetDeviceType();
printf("Product type = %s\n", deviceType);

5.4 ArkTs接口使用

导入模块

import systemparameter from '@ohos.systemParameterEnhance';

同步获取参数值

try {
    let info: string = systemparameter.getSync("const.ohos.apiversion");
    console.log(JSON.stringify(info));
} catch(e) {
    console.log("getSync unexpected error: " + e);
}

异步获取参数值

import { BusinessError } from '@ohos.base';

systemparameter.get("const.ohos.apiversion", (err: BusinessError, data: string) => {
    if (err == undefined) {
        console.log("get value success:" + data);
    } else {
        console.log("get value err:" + err.code);
    }
});

5.5 Shell命令操作

常用命令

# 获取参数值
param get [key]

# 设置参数值
param set key value

# 等待参数值匹配
param wait key value

6. 常见问题排查

6.1 设置系统参数失败

排查步骤

  1. 使用 param set 命令测试是否可设置成功
  2. 检查DAC权限配置是否正确
  3. 检查SELinux权限,根据 avc: denied 告警信息设置规则
  4. 检查系统参数标签内存是否充足

6.2 读取系统参数失败

排查步骤

  1. 确认参数是否已设置:param get key
  2. 检查DAC读权限配置
  3. 检查SELinux读权限设置

6.3 三方应用无法访问系统参数

原因分析

  • 默认DAC规则只允许三方应用get和watch权限
  • 三方应用的selinux权限默认未设置

解决方案

  1. 重新设置DAC规则,增加set权限
  2. 参照MAC访问控制权限设置进行selinux配置

6.4 错误码说明

系统参数操作可能返回的错误码包括:

  • PARAM_CODE_INVALID_NAME(101):参数名不符合规范
  • PARAM_CODE_NOT_FOUND(106):没有找到该参数
  • PARAM_CODE_READ_ONLY(107):参数为只读
  • DAC_RESULT_FORBIDED(1001):DAC权限被禁止
  • SELINUX_RESULT_FORBIDED(1002):selinux权限被禁止

关注鸿蒙百川带你学习更多鸿蒙操作系统知识
在这里插入图片描述

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐