【OpenHarmony实战】系统参数SystemParameter完全指南:param get/set调试技巧与案例精解

1. 系统参数概述

1.1 功能简介

OpenHarmony 系统参数为各系统服务提供简单易用的键值对访问接口,使得各个系统服务可以通过系统参数进行业务功能的配置和状态管理。

(系统参数同android中的系统参数是类似的,命令有所差异)

最常用的命令

clike 复制代码
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字节。

命名格式示例:

plaintext 复制代码
[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 调试日志,返回 true 或 false
param get debug.init.log.level 查看 init 日志级别,如 INFO、DEBUG
param get startup.bootanim.enable 查看是否启用开机动画
param set persist.sys.usb.config hdc 是否开启HDS usb设备识别
param persist.init.bootevent.enable #true 开机启动

3. 系统参数权限管理

3.1 默认权限

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

DAC User DAC Group DAC UGO MAC SELinux Label
root root 775 default_param

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

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

3.2 DAC访问控制

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

配置示例:

plaintext 复制代码
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中定义标签:
java 复制代码
type servicectrl_param, parameter_attr;
  1. 在parameter_contexts中关联参数前缀:
java 复制代码
ohos.servicectrl.           u:object_r:servicectrl_param:s0
  1. 给init授权:
java 复制代码
allow servicectrl_param tmpfs:filesystem associate;
allow init servicectrl_param:file { map open read relabelto relabelfrom };
  1. 设置写权限:
java 复制代码
allow { init samgr hdf_devmgr } servicectrl_param:parameter_service { set };
  1. 设置读权限:
java 复制代码
allow { xxx } servicectrl_param:file { map open read };

权限设置建议:

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

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

4.1 标签文件大小配置

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

配置示例:

plaintext 复制代码
devinfo_public_param=30720
hilog_param=40960

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

4.2 共享内存映射

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

bash 复制代码
-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:

示例内容:

plaintext 复制代码
const.product.name=OHOS-PRODUCT
const.os.version.api=26
const.telephony.enable=false|true

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

5.2 配置文件安装

标准系统安装方法:

gn 复制代码
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++接口使用

基本操作示例:

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接口使用

导入模块:

typescript 复制代码
import systemparameter from '@ohos.systemParameterEnhance';

同步获取参数值:

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

异步获取参数值:

typescript 复制代码
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命令操作

常用命令:

bash 复制代码
# 获取参数值
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权限被禁止

关注鸿蒙百川带你学习更多鸿蒙操作系统知识

相关推荐
youyin5 天前
HarmonyOS ArkUI 组件与自定义组件零基础:从搭页面到组件化开发
华为·harmonyos
HwJack205 天前
【HarmonyOS开发小实践】ArkTS 从 TypeScript 到方舟语言的演进
华为·harmonyos
梦想不只是梦与想5 天前
鸿蒙 应用发布:软件上传流程(二)
鸿蒙·应用发布·软件上传
威哥爱编程5 天前
HarmonyOS 7 星盾机密风控实战:设备风险因子端侧融合计算,可用不可见
harmonyos·arkts
威哥爱编程5 天前
HarmonyOS 7 应用快启实战:关键资源预加载进内存,冷启告别白屏
华为·harmonyos·arkts
马剑威(威哥爱编程)5 天前
【共创稿事节】HarmonyOS 7 视觉 AI 进阶实战:人脸检测 + 通用文字识别(OCR)两步接入
华为·harmonyos·arkts
HMS Core5 天前
HarmonyOS智慧多窗,让应用在任意窗口都“恰到好处”
harmonyos
梦想不只是梦与想6 天前
鸿蒙 应用发布准备工作(一)
harmonyos·鸿蒙上架·鸿蒙应用发布
马剑威(威哥爱编程)6 天前
【共创稿事节】HarmonyOS 7 文搜图实战:自然语言检索本地图片,全流程端侧闭环
华为·harmonyos