1# 热策略定制开发指导
2
3## 概述
4
5### 简介
6
7OpenHarmony默认提供了热策略的特性。设备上发热的器件种类繁多,因此需要结合热等级和热场景,针对各类发热器件定制统一的管控策略。但是不同热等级下的管控动作在不同的产品上规格是不同的,产品希望根据产品的设计规格来定制此特性。OpenHarmony提供了热策略的定制方式,产品定制开发者可根据产品的设计规格来定制这些特性。同时,出于安全性考虑,提供了热策略配置文件加解密的功能支持(可选)。
8
9### 约束与限制
10
11产品定制的配置路径,需要根据[配置策略](https://gitee.com/openharmony/customization_config_policy)决定。本开发指导中的定制路径以`/vendor`进行举例,请开发者根据具体的产品配置策略,修改定制路径。
12
13## 开发指导
14
15### 搭建环境
16
17设备要求:
18
19标准系统开发板,如DAYU200/Hi3516DV300开源套件。
20
21环境要求:
22
23Linux调测环境,相关要求和配置可参考《[快速入门](../quick-start/quickstart-overview.md)》。
24
25### 开发步骤
26
27本文以[DAYU200](https://gitee.com/openharmony/vendor_hihope/tree/master/rk3568)为例介绍热策略的定制方法。
28
291. 在产品目录[(/vendor/hihope/rk3568)](https://gitee.com/openharmony/vendor_hihope/tree/master/rk3568)下创建thermal文件夹。
30
312. 参考[默认热策略的配置文件夹](https://gitee.com/openharmony/powermgr_thermal_manager/tree/master/services/native/profile)创建目标文件夹,并安装到`//vendor/hihope/rk3568/thermal`,文件格式如下:
32
33    ```text
34    profile
35    ├── BUILD.gn
36    ├── thermal_service_config.xml
37    ```
38
393. 参考[默认热策略的配置文件夹中的thermal_service_config.xml](https://gitee.com/openharmony/powermgr_thermal_manager/blob/master/services/native/profile/thermal_service_config.xml)编写定制的thermal_service_config.xml。包含热策略配置说明及定制后的热策略配置如下,以其中两个热等级为例:
40
41    **表1** config配置说明
42
43    | 配置项名称 | 配置项描述 | 配置项类型 | 配置项范围 |
44    | -------- | -------- | -------- | -------- |
45    | name | 定义热策略对应的传感器集合名称 | string | 对应[热等级文档](../subsystems/subsys-thermal_level.md)中定义的传感器集合名称 |
46    | level | 定义热策略对应的热等级 | int | 对应[热等级文档](../subsystems/subsys-thermal_level.md)中传感器集合下定义的热等级 |
47
48    **表2** 配置项说明
49
50    | 配置项名称 | 配置项描述 | 配置项类型 | 配置项范围 |
51    | -------- | -------- | -------- | -------- |
52    | scene	| 使用场景 | string | 对应[热场景文档](../subsystems/subsys-thermal_scene.md)中定义的使用场景 |
53    | charge | 是否在充电 | int | 0(不在充电),1(正在充电) |
54    | screen | 是否亮屏 | int | 0(灭屏),1(亮屏) |
55
56    **表3** 节点配置说明
57
58    | 节点名称 | 节点值类型 | 节点值范围 | 节点描述 |
59    | -------- | -------- | -------- | -------- |
60    | lcd | double | 0.00~1.00 | 屏幕亮度的百分比(用浮点数表示) |
61    | cpu_big | int | 根据产品定义 | CPU大核频率 |
62    | cpu_med | int | 根据产品定义 | CPU中核频率 |
63    | cpu_lit | int | 根据产品定义 | CPU小核频率 |
64    | process_ctrl | enum | 1:KILL_FG_PROCESS_APP<br>2:KILL_BG_PROCESS_APP<br>3:KILL_ALL_PROCESS_APP | 进程控制 |
65    | gpu | int | 根据产品定义 | GPU频率 |
66    | thermallevel | int | 对应config节点中的level | 热等级 |
67    | current_sc | int | 根据产品定义 | 快充电流 |
68    | current_buck | int | 根据产品定义 | 慢充电流 |
69    | voltage_sc | int | 根据产品定义 | 快充电压 |
70    | voltage_buck | int | 根据产品定义 | 慢充电压 |
71    | volume | double | 0.00~1.00 | 音量百分比(用浮点数表示) |
72
73    ```shell
74    <policy>
75        <config name="base_safe" level="1">
76            <lcd>1.00</lcd>
77            <lcd scene="cam">0.99</lcd>
78            <lcd scene="call">0.98</lcd>
79            <lcd scene="game">0.95</lcd>
80            <cpu_big>1992000</cpu_big>
81            <cpu_med>1991500</cpu_med>
82            <cpu_lit>1991200</cpu_lit>
83            <process_ctrl>3</process_ctrl>
84            <cpu_big scene="cam" charge="1">1991800</cpu_big>
85            <cpu_big scene="cam" charge="0">1991600</cpu_big>
86            <gpu screen="0">524288</gpu>
87            <gpu screen="1">512000</gpu>
88            <thermallevel>1</thermallevel>
89            <current_sc>1800</current_sc>
90            <current_sc scene="cam">1200</current_sc>
91            <current_buck>1200</current_buck>
92            <voltage_sc>4000</voltage_sc>
93            <voltage_buck>3000</voltage_buck>
94            <volume>1.0</volume>
95        </config>
96    <policy>
97        <config name="base_safe" level="2">
98            <lcd>0.90</lcd>
99            <lcd scene="cam">0.89</lcd>
100            <lcd scene="call">0.88</lcd>
101            <lcd scene="game">0.87</lcd>
102            <cpu_big>1991000</cpu_big>
103            <cpu_med>1990500</cpu_med>
104            <cpu_lit>1990200</cpu_lit>
105            <process_ctrl>2</process_ctrl>
106            <cpu_big scene="cam" charge="1">1990800</cpu_big>
107            <cpu_big scene="cam" charge="0">1990600</cpu_big>
108            <gpu screen="0">499712</gpu>
109            <gpu screen="1">487424</gpu>
110            <thermallevel>2</thermallevel>
111            <current_sc>1500</current_sc>
112            <current_sc scene="cam">1000</current_sc>
113            <current_buck>1000</current_buck>
114            <voltage_sc>3000</voltage_sc>
115            <voltage_buck>2000</voltage_buck>
116            <volume>0.8</volume>
117        </config>
118    </policy>
119    ```
120
1214. (可选)对热策略配置文件进行本地加密,同时配置解密方法。
122
123    1. 开发者自行选择合适的加密工具对本地将编写好的thermal_service_config.xml进行加密。
124
125    2. 开发者需要编写动态库libthermal_manager_ext.z.so并安装在文件系统中,动态库中包含解密接口getDecryptConfig的实现,程序将调用动态库中实现了的getDecryptConfig(在[base/powermgr/thermal_manager/services/native/src/thermal_policy/thermal_srv_config_parser.cpp](https://gitee.com/openharmony/powermgr_thermal_manager/blob/master/services/native/src/thermal_policy/thermal_srv_config_parser.cpp)中)对配置文件进行解密,解密过程如下所示:
126
127        ```c++
128        bool ThermalSrvConfigParser::DecryptConfig(const std::string& path, std::string& result)
129        {
130            // 请开发者自行实现动态库libthermal_manager_ext.z.so
131            void *handler = dlopen(THERMAL_CONFIG_LIBRARY_PATH, RTLD_LAZY);
132            if (handler == nullptr) {
133                THERMAL_HILOGE(COMP_SVC, "dlopen failed, reason : %{public}s", dlerror());
134                return false;
135            }
136            // 请开发者根据所使用的工具自行实现解密接口getDecryptConfig
137            Func getDecryptConfig = reinterpret_cast<Func>(dlsym(handler, GET_THERMAL_EXT_CONGIH_FUNC));
138            if (getDecryptConfig == nullptr) {
139                THERMAL_HILOGE(COMP_SVC, "find function %{public}s failed, reason : %{public}s",
140                    GET_THERMAL_EXT_CONGIH_FUNC, dlerror());
141                dlclose(handler);
142                return false;
143            }
144            // 调用解密接口进行解密,将解密结果以字符串的形式存储在result中
145            int32_t ret = getDecryptConfig(THERMAL_SERVICE_CONFIG_INDEX, result);
146            if (ret != 0) {
147                THERMAL_HILOGE(COMP_SVC, "decrypt config failed, ret:%{public}d", ret);
148                dlclose(handler);
149                return false;
150            }
151            dlclose(handler);
152            return true;
153        }
154        ```
155
1565. 参考[默认热策略配置文件夹中的BUILD.gn](https://gitee.com/openharmony/powermgr_thermal_manager/blob/master/services/native/profile/BUILD.gn)编写BUILD.gn文件,将thermal_service_config.xml打包到`/vendor/etc/thermal_config`目录下
157
158    ```shell
159    import("//build/ohos.gni")                      # 引用build/ohos.gni
160
161    ohos_prebuilt_etc("thermal_service_config") {
162        source = "thermal_service_config.xml"
163        relative_install_dir = "thermal_config"
164        install_images = [ chipset_base_dir ]       # 安装到vendor目录下的必要配置
165        part_name = "product_rk3568"                # part_name暂定为product_rk3568,以实现后续编译,产品定制根据需要自行修改
166    }
167    ```
168
1696. 将编译目标添加到[ohos.build](https://gitee.com/openharmony/vendor_hihope/blob/master/rk3568/ohos.build)的"module_list"中,例如:
170
171    ```json
172    {
173        "parts": {
174            "product_rk3568": {
175                "module_list": [
176                    "//vendor/hihope/rk3568/default_app_config:default_app_config",
177                    "//vendor/hihope/rk3568/image_conf:custom_image_conf",
178                    "//vendor/hihope/rk3568/preinstall-config:preinstall-config",
179                    "//vendor/hihope/rk3568/resourceschedule:resourceschedule",
180                    "//vendor/hihope/rk3568/etc:product_etc_conf",
181                    "//vendor/hihope/rk3568/thermal/profile:thermal_service_config", // 添加thermal_service_config的编译
182                ]
183            }
184        },
185        "subsystem": "product_hihope"
186    }
187    ```
188    “//vendor/hihope/rk3568/thermal/”为文件夹路径,“profile”为创建的文件夹名字,“thermal_service_config”为编译目标。
189
1907. 参考《[快速入门](../quick-start/quickstart-overview.md)》编译定制版本,编译命令如下:
191
192    ```shell
193    ./build.sh --product-name rk3568 --ccache
194    ```
195
1968. 将定制版本烧录到DAYU200开发板中。
197
198### 调测验证
199
2001. 开机后,进入shell命令行:
201    ```shell
202    hdc shell
203    ```
204
2052. 获取当前热策略信息。
206    ```shell
207    hidumper -s 3303 -a -p
208    ```
209
210    查看定制后的热策略结果如下:
211    ```shell
212    -------------------------------[ability]-------------------------------
213
214
215    ----------------------------------ThermalService---------------------------------
216    name: base_safe	level: 1
217    actionName: lcd	actionValue: 1.00	isProp: 0
218    actionName: lcd	actionValue: 0.99	scene: cam	isProp: 1
219    actionName: lcd	actionValue: 0.98	scene: call	isProp: 1
220    actionName: lcd	actionValue: 0.95	scene: game	isProp: 1
221    actionName: cpu_big	actionValue: 1992000	isProp: 0
222    actionName: cpu_med	actionValue: 1991500	isProp: 0
223    actionName: cpu_lit	actionValue: 1991200	isProp: 0
224    actionName: process_ctrl	actionValue: 3	isProp: 0
225    actionName: cpu_big	actionValue: 1991800	charge: 1	scene: cam	isProp: 1
226    actionName: cpu_big	actionValue: 1991600	charge: 0	scene: cam	isProp: 1
227    actionName: gpu	actionValue: 524288	screen: 0	isProp: 1
228    actionName: gpu	actionValue: 512000	screen: 1	isProp: 1
229    actionName: thermallevel	actionValue: 1	isProp: 0
230    actionName: current_sc	actionValue: 1800	isProp: 0
231    actionName: current_sc	actionValue: 1200	scene: cam	isProp: 1
232    actionName: current_buck	actionValue: 1200	isProp: 0
233    actionName: voltage_sc	actionValue: 4000	isProp: 0
234    actionName: voltage_buck	actionValue: 3000	isProp: 0
235    actionName: volume	actionValue: 1.0	isProp: 0
236    actionName: boost	actionValue: 1	isProp: 0
237
238    level: 2
239    actionName: lcd	actionValue: 0.90	isProp: 0
240    actionName: lcd	actionValue: 0.89	scene: cam	isProp: 1
241    actionName: lcd	actionValue: 0.88	scene: call	isProp: 1
242    actionName: lcd	actionValue: 0.87	scene: game	isProp: 1
243    actionName: cpu_big	actionValue: 1991000	isProp: 0
244    actionName: cpu_med	actionValue: 1990500	isProp: 0
245    actionName: cpu_lit	actionValue: 1990200	isProp: 0
246    actionName: process_ctrl	actionValue: 2	isProp: 0
247    actionName: cpu_big	actionValue: 1990800	charge: 1	scene: cam	isProp: 1
248    actionName: cpu_big	actionValue: 1990600	charge: 0	scene: cam	isProp: 1
249    actionName: gpu	actionValue: 499712	screen: 0	isProp: 1
250    actionName: gpu	actionValue: 487424	screen: 1	isProp: 1
251    actionName: thermallevel	actionValue: 2	isProp: 0
252    actionName: current_sc	actionValue: 1500	isProp: 0
253    actionName: current_sc	actionValue: 1000	scene: cam	isProp: 1
254    actionName: current_buck	actionValue: 1000	isProp: 0
255    actionName: voltage_sc	actionValue: 3000	isProp: 0
256    actionName: voltage_buck	actionValue: 2000	isProp: 0
257    actionName: volume	actionValue: 0.8	isProp: 0
258    actionName: boost	actionValue: 1	isProp: 0
259    ```
260
261## 参考
262开发过程中可参考的配置文件路径:[默认热策略源码路径](https://gitee.com/openharmony/powermgr_thermal_manager/blob/master/services/native/profile/thermal_service_config.xml)
263
264打包路径:`/vendor/etc/thermal_config/hdf`
265
266