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  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