1# 系统参数 2## 概述 3### 功能简介 4 5OHOS系统参数为各系统服务提供简单易用的键值对访问接口,使得各个系统服务可以通过各自的系统参数来进行业务功能的配置。 6 7### 基本概念 8 9图1 系统参数操作原语 10 11![系统参数操作原语](figures/系统参数操作原语.png) 12 13**表1** 系统参数操作原语说明 14| 功能 | 说明 | 15| -------- | -------- | 16| get | 获取系统参数的值 | 17| set | 设置系统参数的值 | 18| wait | 同步等待系统参数的值变更 | 19| watch | 异步观察系统参数的值变更 | 20 21#### 系统参数定义 22 23- 系统参数命名格式 24 25 系统参数名称采用点分格式,由多段组成,每一段可以由字母、数字、下划线组成,总长度不超过96字节;系统参数名称分为两类: 26 27 **表2** 系统参数名称 28 29 | 类别 | 名称 | 示例 | 说明 | 30 | -------- | -------- | -------- | -------- | 31 | 参数名称 | Parameter Name | const.product.**name** | 完整的系统参数名称,末尾不是"."。 | 32 | 参数目录 | Parameter Directory | const.product **.** | 以"."结尾,标识相同前缀的所有系统参数集合。 | 33 34- 系统参数类型 35 36 系统参数一共分为三大类: 37 38 **表3** 系统参数分类 39 40 | 类别 | 前缀 | 说明 | 41 | -------- | -------- | -------- | 42 | 常量 | const. | 常量参数,一旦赋值后续不会再变更;值最大长度为4096字节(包括结束符)。 | 43 | 可写 | 其它 | 可写参数,重启后丢失,值最大长度96字节(包括结束符)。| 44 | 可持久化 | persist. | 可写并可持久化保存参数,重启后不会丢失,值最大长度96字节(包括结束符)。| 45 46 每个系统参数名称总体格式如下: 47 ``` 48 [ const | persist ].$sub_system.$desc 49 ``` 50 $sub_system为子系统或模块的名称。 51 52 $desc为子系统或模块下参数的描述字符,可以为点分格式进行分级描述。 53 54#### 系统参数定义规则 55 56每个子系统定义各自模块的系统参数,包括系统参数名称、默认值以及系统参数的权限访问信息。 57 58- 系统参数值定义文件 59 60 - 系统参数值定义文件后缀名为".para" ,其格式示例如下: 61 62 ```shell 63 # This is comment 64 const.product.name=OHOS-PRODUCT 65 const.os.version.api=26 66 const.telephony.enable=false|true 67 68 const.test.withblank=My Value 69 const.test.withcomment=MyValue # This should be ommitted 70 const.test.multiline="This is a multiline parameter. 71 Line2 value. 72 Last line." 73 ``` 74 75 - 系统参数必须通过完整的系统参数命令来赋值,赋值方式分为三大类: 76 77 **表4** 系统参数赋值方式 78 79 | 类别 | 示例 | 说明 | 80 | -------- | -------- | -------- | 81 | 字符串 | const.product.name=OHOS-PRODUCT | 多行字符串需要通过引号扩起来。 | 82 | 数字 | const.os.version.api=26 | 数字不需要。| 83 | 布尔 | const.telephony.enable=false | 布尔型的可以为0,1,false,true。| 84 85- 系统参数DAC访问控制定义文件 86 87 当前系统参数的访问权限控制通过自主访问控制(Discretionary Access Control)方式管理,访问权限定义文件后缀名为".para.dac" ,示例如下: 88 89 ```java 90 const.product.="root:root:660" 91 ``` 92 93 如上所示,可以通过参数路径为相同前缀的所有系统参数定义一类访问权限信息;DAC信息通过":"分三段来描述,分别为参数的user,group以及UGO规则信息。 94 95 UGO规则信息每一位的定义如下: 96 97 **图2** UGO规则信息 98 99 ![UGO规则信息](figures/系统参数DAC.png) 100 101- 系统参数配置selinux策略 102 103 - 添加selinux标签 104 105 为系统参数添加selinux标签,首先需要在文件/base/security/selinux/sepolicy/base/public/parameter.te中定义标签,例如: 106 107 ```java 108 type servicectrl_param, parameter_attr 109 ``` 110 111 标签定义完成后,在文件/base/security/selinux/sepolicy/base/public/parameter_contexts中添加和标签关联的系统参数前缀,这里以前缀ohos.servicectrl.为例: 112 113 ```java 114 ohos.servicectrl. u:object_r:servicectrl_param:s0 115 ``` 116 117 - 给init授权,允许map等操作,在文件/base/security/selinux/sepolicy/ohos_policy/startup/init/public/init.te中补充下面内容: 118 119 ```java 120 allow servicectrl_param tmpfs:filesystem associate; 121 allow init servicectrl_param:file { map open read relabelto relabelfrom }; 122 ``` 123 124 - 设置写权限,这里允许init samgr hdf_devmgr 进行系统参数写: 125 126 ```java 127 allow { init samgr hdf_devmgr } servicectrl_param:parameter_service { set }; 128 ``` 129 130 - 设置读权限,如果只允许部分进程访问可单独对该进程授权: 131 132 ```java 133 allow { xxx } servicectrl_param:file { map open read }; 134 ``` 135 136 - 如果全部允许,则设置为: 137 138 ```java 139 allow { domain -limit_domain } servicectrl_param:file { map open read }; 140 ``` 141 142- 建议: 143 144 各个子系统只保留两个系统参数标签: 145 146 一个私有,用来控制系统参数设置 147 148 一个公有,允许所有服务进行访问 149 150- 默认参数加载 151 152 系统参数的加载顺序如下: 153 154 **表5** 系统参数加载顺序 155 | 类别 | 路径 | 说明 | 156 | -------- | -------- | -------- | 157 | 内核参数 | /proc/cmdline | 将内核参数中的部分值转化成系统参数,并保存。内核参数中.xxx=valXXX类型的参数都转换成ohos.boot.xxx=valXXX系统参数。 | 158 | OS系统参数 | /system/etc/param/ohos_const/*.para | OS固定系统参数值参数优先加载。 | 159 | vendor参数 | /vendor/etc/param/*.para | 厂商定义的系统参数次优先级加载。 | 160 | system参数 | /system/etc/param/*.para | 加载各子系统定义的参数参数。如果系统参数已经存在,则忽略掉。 | 161 | persist参数 | /data/parameters/ | 如果持久化参数存在,则最后加载持久化系统参数。持久化系统参数会覆盖加载的默认系统参数。 | 162 163#### 系统参数标签文件大小配置 164 165如果标签对应的系统参数个数多,超过5条时,需要配置系统参数标签文件的大小,默认大小(512),配置文件为/base/startup/init/services/etc/param/ohos.para.size 166 167配置规则: 168 169系统参数标签=大小 170 171例如: 172 173```java 174startup_init_param=40960 175``` 176 177### 约束与限制 178 179仅限小型系统、标准系统下使用。 180 181## 开发指导 182 183### 场景介绍 184设定特定的系统参数 185 186### 接口说明 187 188 - Shell命令接口 189 190 通过shell命令中可直接操作系统参数(只在标准系统提供)。系统参数shell命令如下表所示: 191 192 **表6** 系统参数shell命令说明 193 194 | 功能 | 说明 | 195 | -------- | -------- | 196 | param get [**key**] | 获取指定key名称的系统参数值;如果不指定任何name,则返回所有系统参数值。 | 197 | param set **key value** | 设置指定key名称的参数值为value。 | 198 | param wait **key** **value** | 同步等待指定key名称的系统参数值与value匹配。value可支持模糊匹配,如"*"表示任何值,"val\*"表示只匹配前三个val字符。 | 199 | param watch | 异步观察系统参数的值变更。| 200 201 - syspara系统接口 202 203 在Coding中可以调用下列函数接口,获取对应的系统参数值(系统参数接口返回的为const字符串,不支持free操作)。 204 205 **表7** 系统属性接口说明 206 | 接口名 | 描述 | 207 | -------- | -------- | 208 | int GetParameter(const char\* key, const char\* def, char\* value, unsigned int len) | 获取系统参数。 | 209 | int SetParameter(const char\* key, const char\* value) | 设置/更新系统参数。 | 210 | const char\* GetDeviceType(void) | 返回当前设备类型。 | 211 | const char\* GetManufacture(void) | 返回当前设备生产厂家信息。 | 212 | const char\* GetBrand(void) | 返回当前设备品牌信息。 | 213 | const char\* GetMarketName(void) | 返回当前设备传播名。 | 214 | const char\* GetProductSeries(void) | 返回当前设备产品系列名。 | 215 | const char\* GetProductModel(void) | 返回当前设备认证型号。 | 216 | const char\* GetSoftwareModel(void) | 返回当前设备内部软件子型号。 | 217 | const char\* GetHardwareModel(void) | 返回当前设备硬件版本号。 | 218 | const char\* GetHardwareProfile(void) | 返回当前设备硬件profile。 | 219 | const char\* GetSerial(void) | 返回当前设备序列号(SN号)。 | 220 | const char\* GetOSFullName(void) | 返回操作系统名。 | 221 | const char\* GetDisplayVersion(void) | 返回当前设备用户可见的软件版本号。 | 222 | const char\* GetBootloaderVersion(void) | 返回当前设备Bootloader版本号。 | 223 | const char\* GetSecurityPatchTag(void) | 返回安全补丁标签。 | 224 | const char\* GetAbiList(void) | 返回当前设备支持的指令集(Abi)列表。 | 225 | int GetSdkApiVersion(void) | 返回与当前系统软件匹配的SDK API 版本号。 | 226 | int GetFirstApiVersion(void) | 返回系统软件首版本SDK API 版本号。 | 227 | const char\* GetIncrementalVersion(void) | 返回差异版本号。 | 228 | const char\* GetVersionId(void) | 返回版本id。 | 229 | const char\* GetBuildType(void) | 返回构建类型。 | 230 | const char\* GetBuildUser(void) | 返回构建账户用户名。 | 231 | const char\* GetBuildHost(void) | 返回构建主机名。 | 232 | const char\* GetBuildTime(void) | 返回构建时间。 | 233 | const char\* GetBuildRootHash(void) | 返回当前版本hash。 | 234 | const char\* GetOsReleaseType(void) | 返回系统发布类型。 | 235 | int GetDevUdid(char \*udid, int size) | 获取设备udid。 | 236 | const char *AclGetSerial(void); | 返回当前设备序列号(SN号)(带访问权限检查)。 | 237 | int AclGetDevUdid(char *udid, int size); | 获取设备udid(带访问权限检查)。 | 238 239### 开发步骤 240 2411. 系统参数定义 242 243 通过定义子系统或者产品的.para和.para.dac文件,实现默认系统参数的定义和权限控制。 244 245 在标准系统上通过ohos_prebuilt_para模版安装配置文件到到/etc/param/目录下,GN脚本示例如下: 246 247 ```go 248 import("//base/startup/init/services/etc/param/param_fixer.gni") 249 250 ohos_prebuilt_para("ohos.para") { 251 source = "//base/startup/init/services/etc/ohos.para" 252 part_name = "init" 253 module_install_dir = "etc/param" 254 } 255 256 ohos_prebuilt_para("ohos.para.dac") { 257 source = "//base/startup/init/services/etc/ohos.para.dac" 258 part_name = "init" 259 module_install_dir = "etc/param" 260 } 261 ``` 262 263 在小系统上,通过copy命令,把对应的系统参数定义文件拷贝到system/etc/param目录下 264 ```go 265 copy("ohos.para") { 266 sources = [ "//base/startup/init/services/etc/param/ohos.para" ] 267 outputs = [ "$root_out_dir/system/etc/param/ohos.para" ] 268 } 269 copy("ohos.para.dac") { 270 sources = [ "//base/startup/init/services/etc/param/ohos.para.dac" ] 271 outputs = [ "$root_out_dir/system/etc/param/ohos.para.dac" ] 272 } 273 ``` 274 在mini系统上,通过action把所有定义的默认系统参数转化成头文件,并编译到系统中 275 ```go 276 action("lite_const_param_to") { 277 script = "//base/startup/init/scripts/param_cfg_to_code.py" 278 args = [ 279 "--source", 280 rebase_path( 281 "//base/startup/init/services/etc_lite/param/ohos_const/ohospara"), 282 "--dest_dir", 283 rebase_path("$root_out_dir/gen/init/"), 284 "--priority", 285 "0", 286 ] 287 outputs = [ "$target_gen_dir/${target_name}_param_cfg_to_code.log" ] 288 } 289 ``` 2902. 系统参数使用实例 291 ``` 292 // set && get 293 char key1[] = "rw.sys.version"; 294 char value1[] = "10.1.0"; 295 int ret = SetParameter(key1, value1); 296 char valueGet1[128] = {0}; 297 ret = GetParameter(key1, "version=10.1.0", valueGet1, 128); 298 299 // get sysparm 300 char* value1 = GetDeviceType(); 301 printf("Product type =%s\n", value1); 302 303 char* value2 = GetManufacture(); 304 printf("Manufacture =%s\n", value2); 305 306 char* value3 = GetBrand(); 307 printf("GetBrand =%s\n", value3); 308 309 char* value4 = GetMarketName(); 310 printf("MarketName =%s\n", value4); 311 312 char* value5 = GetProductSeries(); 313 printf("ProductSeries =%s\n", value5); 314 315 char* value6 = GetProductModel(); 316 printf("ProductModel =%s\n", value6); 317 318 char* value7 = GetSoftwareModel(); 319 printf("SoftwareModel =%s\n", value7); 320 321 char* value8 = GetHardwareModel(); 322 printf("HardwareModel =%s\n", value8); 323 324 char* value9 = GetHardwareProfile(); 325 printf("Software profile =%s\n", value9); 326 327 char* value10 = GetSerial(); 328 printf("Serial =%s\n", value10); 329 330 char* value11 = GetOSFullName(); 331 printf("OS name =%s\n", value11); 332 333 char* value12 = GetDisplayVersion(); 334 printf("Display version =%s\n", value12); 335 336 char* value13 = GetBootloaderVersion(); 337 printf("bootloader version =%s\n", value13); 338 339 char* value14 = GetSecurityPatchTag(); 340 printf("secure patch level =%s\n", value14); 341 342 char* value15 = GetAbiList(); 343 printf("abi list =%s\n", value15); 344 345 int value16 = GetFirstApiVersion(); 346 printf("first api level =%d\n", value16); 347 348 char* value17 = GetIncrementalVersion(); 349 printf("Incremental version = %s\n", value17); 350 351 char* value18 = GetVersionId(); 352 printf("formal id =%s\n", value18); 353 354 char* value19 = GetBuildType(); 355 printf("build type =%s\n", value19); 356 357 char* value20 = GetBuildUser(); 358 printf("build user =%s\n", value20); 359 360 char* value21 = GetBuildHost(); 361 printf("Build host = %s\n", value21); 362 363 char* value22 = GetBuildTime(); 364 printf("build time =%s\n", value22); 365 366 char* value23 = GetBuildRootHash(); 367 printf("build root later..., %s\n", value23); 368 369 char* value24 = GetOsReleaseType(); 370 printf("OS release type =%s\n", value24); 371 372 char* value25 = GetOsReleaseType(); 373 printf("OS release type =%s\n", value25); 374 375 char value26[65] = {0}; 376 GetDevUdid(value26, 65); 377 printf("device udid =%s\n", value26); 378 ```