• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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    ```