1# Resource_Schedule_Service**进程管理规范**
2
3**注:新增插件或新增事件,要按照以下要求添加到相对应的Check_List中。**
4
5## • **插件管理规范**
6
7注:新增加插件会引起resource_schedule_service进程内存增长,且resource_schedule_service进程存在内存基线,为了避免resource_schedule_service进程因新增插件导致内存无序增长,**因此只要新增加插件都要重新进行评审resource_schedule_service进程的内存基线**。
8
9因此新增插件需要统计两种内存
10
111:进程基线内存:为了申请resource_schedule_service进程内存所需要的数据。
12
132:插件内存:用于统计插架实际增加的内存开销。
14
15新增插件需要测试以上两种内存,**并统计到插件check_list**中。
16
17### 1. **插件内存规范**
18
19#### 内存测试类型及方法:
20
21##### 1:进程基线内存测试:以进程为单位统计内存
22
23​	测试方法:
24
25​	    预先准备好,能引起新增插件注册的所有事件的场景。
26
27​	    开启新增插件,共测试三轮,一轮内统计**常驻内存**和**动态内存**,取平均值。三轮结果再取平均值。
28
29​    测试类型:
30
31​		1)常驻内存:设备开机,静置三分钟。按照预先设定的场景执行操作,结束任务并退至后台。静置五分钟,每3秒统计一次进程resource_schedule_service的PSS内存值,统计30分钟采集600次样本,取平均值。
32
33​		2)动态内存: 设备开机,静置三分钟。按照预先设定的场景,连续不断地执行操作(建议脚本自动执行),每1秒统计一次进程resource_schedule_service的PSS内存值,统计10分钟采集600次样本,取平均值。
34
35##### 2:插件内存测试:以插件为单位统计内存
36
37​	测试方法:
38
39​	    预先准备好,能引起新增插件注册的所有事件的场景。
40
41​	    开启和关闭新增插件,共测试三轮,**(每一轮为开启测试+关闭测试)**,一轮内统计常驻内存的开启插件和关闭插件的差值的平均值,和动态内存的开启插件和关闭插件的差值的平均值。三轮结果再取平均值。
42
43​    测试类型:
44
45​		1)常驻内存:设备开机,静置三分钟。按照预先设定的场景执行操作,结束任务并退至后台。静置五分钟,每3秒统计一次进程resource_schedule_service的PSS内存值,统计30分钟采集600次样本,取平均值。
46
47​		2)动态内存: 设备开机,静置三分钟。按照预先设定的场景,连续不断地执行操作(建议脚本自动执行),每1秒统计一次进程resource_schedule_service的PSS内存值,统计10分钟采集600次样本,取平均值。
48
49
50
51#### 其他测试类型:
52
53场景内存:后续可能会增加一些常用的场景测试,比如top app,相机等常用场景。
54
55#### 评审:
56
57新增插件需要统计好**进程基线内存数据**,参与内存评审,评审人:黄昌华
58
59注:相关数据统计到check_list中。
60
61
62
63### 2. **插件执行效率规范**
64
65由于插件分发事件为串行分发,所以对插件接收分发事件有比较强的性能要求,原则上需要插件接收事件后可以快速返回,事件尽量异步处理。所以对于插件的执行效率就有了一定的要求。
66
67原则上,插件只做为接收事件用途,后续其它任何耗时业务,都需要发给具体服务进程/线程执行,以保证接收事件效率。(详见第3章)
68
691. 插件执行耗时尽量不能超过1ms,超过1ms即会产生相关WRNING警告,在开发插件过程中,需要尽量消除此类情况,插件需要上库到系统,则需要提供monkey测试中,每24H的WARNING<= 3次。
70
71
72测试方式:
73
74可以通过 hilog | grep deliverResourceToPlugin 抓取日志获取,如果超时会在是日志打印出来。
75
76
77
78### 3. **插件线程和关联进程**
79
80由于插件需要高效的接收RSS框架的事件,所以推荐使用插件接收到事件后,即启动一个handler进行后续的事件处理。而这个handler原则上即使用IPC进行事件转发,分发到对应模块的services中进行事件次处理。这样即保证了插件不会增加太多RSS框架的开销,也能够快速的对事件进行响应。
81
82
83
84 ![img](figures/resource_schedule_service.png)
85
86
87
88使用如此方式的插件,则只会增加RSS框架一个线程。而如果有特殊需求,需要增加RSS框架进程多个线程的,则需要说明原因并且参与评审,并且梳理清楚以下几点。
89
901:线程数目,以及线程执行的内容。
91
922:线程所需要的权限,以及权限对应的任务。
93
943:线程所关联的进程,以及这些进程是否强耦合RSS框架,能否脱离RSS框架独立运行。
95
96如果特殊情况需要评审,详见附件1.
97
98
99
100### 4. 新插件加入**check_list**
101
102| 插件名             | 插件名                                                       |
103| ------------------ | ------------------------------------------------------------ |
104| 插件功能简介       | 简单描述插件功能,以README形式提供在resource_schedule_service仓中 |
105| 插件订阅事件       | 给出插件订阅的事件列表                                       |
106| 进程基线内存       | 增加插件后resource_schedule_service进程PSS内存值。1:常驻内存 2:动态内存 |
107| 插件内存           | 插件引起resource_schedule_service框架内存增长的PSS值。1:常驻内存 2:动态内存 |
108| 插件的事件执行效率 | 以RK3568为准,所有订阅事件执行效率均需有保证。上库前需要提供稳定运行24H的RSS框架日志,保证无告警。 |
109| 插件新增线程       | 插件新增的线程 以及各个线程的用途                            |
110| 插件关联进程       | 插件会与哪些关联进程进行通信,是否存在其它进程依赖           |
111| 插件需要的权限     | 读写特性IO的selinux权限等(暂时不涉及)                        |
112| 插件负责人         | 增加插件的人员                                               |
113
114
115
116
117
118## • 事件管理规范
119
120### 1. **事件传输标准格式**
121
122根据IPC接口的传输规范,传输事件一般需要有
123
124type_id , value , payload
125
126type_id :  unit_32_t 型;事件标志。
127
128Value   :   int型;内容可自行定义,一般用于区分事件的动作或者子类。
129
130Payload : 接口类型unordered_map<string,string>型,用于更详细的消息传递。
131
132根据res_type.h中定义所需要的事件,添加相应信息。
133
134
135
136RSS框架的事件完全继承IPC的传输规范,开发者可以在RSS框架代码中res_type.h中定义需要的事件type_id,以及定义对应的value和payload格式。
137
138其中value一般为int型的值,大部分事件中只取0/1。
139
140payload为unordered_map<string,string>型。
141
142
143
144Payload在RSS框架使用Json格式,大概如下:
145
146{
147
148“key1”: int_value1,
149
150“key2”: string_value1,
151
152“key3”: [list_int_value1,list_int_value2],
153
154“key4”: {
155
156  “map_key1”: map_int_value1,
157
158  “map_key2”: map_string_value1
159
160}
161
162}
163
164例如:
165
166type: RES_TYPE_WINDOW_FOCUS
167
168value: 0:start, 1:finish
169
170payload: {
171
172“pid”: 1234,
173
174“uid”: 1000,
175
176“bundleName”: “xxxxx”
177
178}
179
180
181
182Json格式有着非常丰富的库方法进行解析和生成,这里RSS框架代码推荐使用lib-jsoncpp-dev进行相关操作。尽可能减少其它三方库引入以节约内存。
183
184
185
186### 2. **事件打点性能**
187
188A. 事件打点延时
189
190事件本身有一定的传递效率,比如焦点切换的事件,在发生焦点切换事件后,需要多少时间才能让订阅焦点切换事件的第一个插件接收到该事件,这个延时即为焦点切换事件的性能(社区RK3568进行测试)。
191
192测试方法:
193
194​    开始点:”ResSchedClient::ReportData receive resType = xxx“ 或 “ResSchedClient::ReportDataInProcess resType = xxx”
195
196​    结束点:“PluginMgr::DispatchResource resType resType = xxx”
197
198标准:<10ms。
199
200
201
202
203
204### 3. 新事件加入**check_list**
205
206| 事件type        | Type名称记录在res_type.h中                     |
207| --------------- | ---------------------------------------------- |
208| 事件用途        | 简单描述事件的用途记录在res_type.h中           |
209| 事件value       | 需要描述清楚value含义                          |
210| 事件payload格式 | 需要描述payload格式以及每个字段的含义          |
211| 事件打点延时    | 以RK3568测试为准,记录第一个插件收到事件的延时 |
212| 订阅事件插件    | 给出订阅了改事件的插件名列表。                 |
213
214
215
216
217
218
219
220
221
222##  **Check_List**
223
224### 1:插件Check_List
225
226更新2022年2月18日14:35:24
227
228| 插件名            | 插件功能简介 | 插件订阅事件                                                 | 进程基线内存(KB)     | 插件内存基线(KB)     | 插件的事件执行效率 | 插件新增线程 | 插件关联进程    | 插件需要的权限 | 插件负责人 |
229| ----------------- | ------------ | :----------------------------------------------------------- | ---------------------- | :------------------- | ------------------ | ------------ | --------------- | -------------- | ---------- |
230| soc_perf          | cpu提频      | RES_TYPE_APP_STATE_CHANGE; RES_TYPE_WINDOW_FOCUS; RES_TYPE_CLICK_RECOGNIZE;RES_TYPE_PUSH_PAGE;  RES_TYPE_SLIDE_RECOGNIZE; | 常驻:5918  动态:5922 | 常驻:88      动态:88 | 无                 | 无           | socperf_service | 无             | HaoyangT   |
231| frame_aware_sched | 智能感知调度 | RES_TYPE_WINDOW_FOCUS;  RES_TYPE_PROCESS_STATE_CHANGE;  RES_TYPE_APP_STATE_CHANGE | 常驻:4537             | 常驻:109            |                    |              | 暂无            |                | rongkunshi |
232| component_sched | 外设调度 | RES_TYPE_SCREEN_STATUS;RES_TYPE_APP_STATE_CHANGE;RES_TYPE_ABILITY_STATE_CHANGE;RES_TYPE_EXTENSION_STATE_CHANGE;RES_TYPE_PROCESS_STATE_CHANGE;RES_TYPE_WINDOW_FOCUS; RES_TYPE_DEVICE_STILL_STATE_CHANGE; | 常驻:             | 常驻: 动态:            |                    |              | 暂无            |                | linyunxuan |
233
234### 2:事件Check_List
235
236更新2022年6月01日14:35:24
237
238| 事件type                        | 事件用途                             | 事件value                 | 事件payload格式                                              | 事件打点延时: | 订阅事件插件           |
239| ------------------------------- | ------------------------------------ | ------------------------- | ------------------------------------------------------------ | ------------- | ---------------------- |
240| RES_TYPE_SCREEN_STATUS          | 屏幕状态                             | 0:屏幕暗 1:屏幕亮       | 无需payload                                                  |               |                        |
241| RES_TYPE_APP_STATE_CHANGE       | APP状态改变事件                      | value : app state         | {"pid"=?,"uid"=?,"bundleName"="?"}                          | <10ms         | soc_perf;  frame_aware |
242| RES_TYPE_ABILITY_STATE_CHANGE   | ABILITY状态改变事件                  | value : ability state     | {"pid"=?,"uid"=?,"bundleName"="?"}                           |               |                        |
243| RES_TYPE_EXTENSION_STATE_CHANGE | EXTENSION状态改变事件                | value :extension state   | {"pid"=?,"uid"=?,"bundleName"="?"}                           |               |                        |
244| RES_TYPE_PROCESS_STATE_CHANGE   | 进程状态事件                         | 0:创建 1:销毁           | {"pid"=?,"uid"=?,"bundleName"="?"}                           | <10ms         | frame_aware            |
245| RES_TYPE_WINDOW_FOCUS           | 窗口聚焦事件                         | 0:聚焦1:不聚焦          | {"pid"=?,"uid"=?,"bundleName"="?",  "windowId"=?,"windowType"=?,displayId=?} | <10ms         | soc_perf ; frame_aware |
246| RES_TYPE_TRANSIENT_TASK         | 瞬态任务事件                         | 0:开始  1:结束          | {"pid"=?,"uid"=?,"bundleName"="?"}                           |               |                        |
247| RES_TYPE_CONTINUOUS_TASK        | 长时任务事件                         | 0:开始  1:结束          | {"pid"=?,"uid"=?,"abilityName"="?"}                          |               |                        |
248| RES_TYPE_CGROUP_ADJUSTER        | cgroup改变事件                       | 0: 进程组分组变化  1: 线程分组变化 | {"pid"=?,"uid"=?,"name"="?","oldGroup"=?, "newGroup"=?}      |               |                        |
249| RES_TYPE_CLICK_RECOGNIZE        | ace手势点击识别器                    | 无                        | 无                                                           | <10ms         | soc_perf               |
250| RES_TYPE_PUSH_PAGE              | ace pipeline_context.cpp::PushPage() | 无                        | 无                                                           | <10ms         | soc_perf               |
251| RES_TYPE_SLIDE_RECOGNIZE        | ace slide event recognize            | 1: list fling on; 0: list fling off; 3: slide normal begin, 4: slide normal end | 无                                                           | <10ms         | soc_perf               |
252| RES_TYPE_WINDOW_VISIBILITY_CHANGE     | 窗口可见性状态变化事件          | 1: 可见, 0: 不可见     | 无                    | - | - |
253| RES_TYPE_REPORT_MMI_PROCESS           | 上报mmi_service线程ID          | mmi_service线程号     | {"uid"=?, "pid"=?}    | - | - |
254| RES_TYPE_REPORT_RENDER_THREAD         | 上报应用的RSRender线程ID       | RSRenderThread线程号   |  {"uid"=?, "pid"=?}   | - | - |
255| RES_TYPE_APP_INSTALL_UNINSTALL  | 应用安装和卸载事件                    | value 0: 卸载, 1: 安装  | {"uid"=?,"bundleName"="?} | - | - |
256| RES_TYPE_WIFI_CONNECT_STATE_CHANGE | wifi连接状态事件                  | 1:空闲, 2:连接中, 3:已连接, 4:断开中, 5:已断开   | 无需payload | - | - |
257| RES_TYPE_USER_SWITCH            | 用户切换事件                         | value: 切换到的目标用户id  | 无需payload         | - | - |
258| RES_TYPE_USER_REMOVE            | 用户删除事件                         | value: 删除的用户id        | 无需payload         | - | - |
259| RES_TYPE_SCREEN_LOCK            | 锁屏和解锁事件                       | 0:解锁 1:锁屏             | 无需payload         | - | - |
260| RES_TYPE_CALL_STATE_UPDATE          | 电话状态改变事件                 | value:电话状态             | 无需payload         | - | - |
261| RES_TYPE_AUDIO_RENDER_STATE_CHANGE  | 音频流状态改变事件               | value:音频流状态           | {"uid"=?,"sessionId"=?}          | - | - |
262| RES_TYPE_AUDIO_RING_MODE_CHANGE     | 声音模式改变事件                 | 0:响铃模式 1:静音模式     | 无需payload         | - | - |
263| RES_TYPE_AUDIO_VOLUME_KEY_CHANGE    | 音量改变事件                     | value:音量大小             | {"volumeType"=?}         | - | - |
264| RES_TYPE_POP_PAGE    | ace pipeline_context.cpp::PopPage();          | 无             |{"pid"=?,"uid"=?,"bundleName"="?","abilityName"="?", "pageUrl"="?"} | - | - |
265| RES_TYPE_WEB_GESTURE                | web手势事件                     | 无                        |无     | -        | -       |
266| RES_TYPE_SHOW_REMOTE_ANIMATION      | 动画开始事件                     | 0:动画开始 1:动画结束     | {"srcPid"=?}     | -        | -       |
267| RES_TYPE_DEVICE_STILL_STATE_CHANGE             | 当前设备运动状态和静止状态转变事件             | -1: 无效值,0: 转变为运动状态,1:转变为静止状态                        |无     | -        | -       |
268| RES_TYPE_RESIZE_WINDOW            | 窗口缩放事件                               | 0: 窗口缩放开始,1:窗口缩放结束                                                              |无     | -        | -       |
269| RES_TYPE_MOVE_WINDOW             | 窗口拖拽事件                             | 0: 窗口拖拽开始,1:窗口拖拽结束                                                              |无     | -        | -       |
270| RES_TYPE_LOAD_PAGE              | 页面加载事件             | 0: 页面加载开始,1:页面加载结束                        |无     | -        | -       |
271| RES_TYPE_DRAG_STATUS_BAR     | 状态栏下拉事件                              | 0:状态栏下拉开始, 1:状态栏下拉结束                                                            |无     | -        | -       |
272| RES_TYPE_REPORT_SCENE_BOARD        | 报告sceneBoard进程信息      | 进程PID     |{"uid"=?, "mainTid"=?, "bundleName"=?}     | -        | -       |
273| RES_TYPE_REPORT_KEY_THREAD         | 报告关键线程                | 0:新增,1:删除     | {"uid"=?, "pid"=?, "tid"=?, "role"=?}     | -        | -       |
274| RES_TYPE_REPORT_WINDOW_STATE       | 报告窗口状态                | 0:新增,1:删除     | {"uid"=?, "pid"=?, "windowId"=?, "serialNum"=?, "state"=0 active 1 inactive}     | -        | -       |
275| RES_TYPE_REPORT_SCENE_SCHED        | 报告场景状态                | 0:场景进入,1:场景退出   | {"uid"=?, "sceneId"=?,}   | -        | -       |
276
277
278
279
280
281
282
283
284## 附件1:
285
286评审入口可以在社区提issues,标题为XXX评审,并根据下方的“**评审问题模板**”给出详细内容。
287
288每天定期检查待评审issues。待评审人可以在“附件2中”跟踪问题进展。
289
290
291
292评审问题模板:
293
294| 待评审人员 | PR   | 问题描述 | 问题详细描述 |
295| ---------- | ---- | -------- | ------------ |
296| XXX        | xx   | Xxx      | Xxx          |
297
298
299
300
301
302
303
304##  附件2:
305
306评审记录汇总表
307
308| ID   |      | 待评审人员 | 评审结果 | 问题描述 | 问题评审纪要 | 评审时间 |
309| ---- | ---- | ---------- | -------- | -------- | ------------ | -------- |
310|      |      |            |          |          |              |          |
311
312
313
314
315
316
317
318
319