【OpenHarmony实战】系统参数SystemParameter完全指南:param get/set调试技巧与案例精解
1. 系统参数概述
1.1 功能简介
OpenHarmony 系统参数为各系统服务提供简单易用的键值对访问接口,使得各个系统服务可以通过系统参数进行业务功能的配置和状态管理。
(系统参数同android中的系统参数是类似的,命令有所差异)
最常用的命令
hdc shell param get 系统参数键
hdc shell param set 系统参数键 系统参数值或者进入hdc shell
param get 系统参数键
param set 系统参数键 系统参数值甚至你还可以直接进入param_shell(小众但是个人觉得还是比较好用的):hdc shell param_shell然后直接get/set
比如:
watch persist.sys.usb.config
get persist.sys.usb.config
set persist.sys.usb.config mtp
set persist.sys.usb.config hdc
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 调试日志,返回 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
。
配置示例:
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标签步骤:
- 在parameter.te中定义标签:
type servicectrl_param, parameter_attr;
- 在parameter_contexts中关联参数前缀:
ohos.servicectrl. u:object_r:servicectrl_param:s0
- 给init授权:
allow servicectrl_param tmpfs:filesystem associate;
allow init servicectrl_param:file { map open read relabelto relabelfrom };
- 设置写权限:
allow { init samgr hdf_devmgr } servicectrl_param:parameter_service { set };
- 设置读权限:
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 参数加载顺序
系统参数按以下顺序加载:
- 内核参数:
/proc/cmdline
(转换为ohos.boot.xxx
形式) - OS系统参数:
/system/etc/param/ohos_const/*.para
- vendor参数:
/vendor/etc/param/*.para
- system参数:
/system/etc/param/*.para
(已存在参数忽略) - 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 设置系统参数失败
排查步骤:
- 使用
param set
命令测试是否可设置成功 - 检查DAC权限配置是否正确
- 检查SELinux权限,根据
avc: denied
告警信息设置规则 - 检查系统参数标签内存是否充足
6.2 读取系统参数失败
排查步骤:
- 确认参数是否已设置:
param get key
- 检查DAC读权限配置
- 检查SELinux读权限设置
6.3 三方应用无法访问系统参数
原因分析:
- 默认DAC规则只允许三方应用get和watch权限
- 三方应用的selinux权限默认未设置
解决方案:
- 重新设置DAC规则,增加set权限
- 参照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权限被禁止
关注鸿蒙百川带你学习更多鸿蒙操作系统知识