1# ArkWeb进程 2<!--Kit: ArkWeb--> 3<!--Subsystem: Web--> 4<!--Owner: @weixin_41848015--> 5<!--Designer: @libing23232323--> 6<!--Tester: @ghiker--> 7<!--Adviser: @HelloCrease--> 8 9ArkWeb是多进程模型,分为应用进程、Web渲染进程、Web GPU进程、Web孵化进程和Foundation进程。 10 11> **说明:** 12> 13> Web内核对内存大小的申请没有限制约束。 14 15**图1** ArkWeb进程模型图 16 17 18 19- 应用进程中Web相关线程(应用唯一) 20 21 - 应用进程为主进程。包含网络线程、Video线程、Audio线程和IO线程等。 22 23 - 负责Web组件的对外接口与回调处理,网络请求、媒体服务等需要与其他系统服务交互的功能。 24 25- Foundation进程(系统唯一) 26 27 负责接收应用进程进行孵化进程的请求,管理应用进程和Web渲染进程的绑定关系。 28 29- Web孵化进程(系统唯一) 30 31 - 负责接收Foundation进程的请求,执行孵化Web渲染进程与Web GPU进程。 32 33 - 执行孵化后处理安全沙箱降权、预加载动态库,以提升性能。 34 35- Web渲染进程(应用可指定多Web实例间共享或独立进程) 36 37 - 负责运行Web渲染进程引擎(HTML解析、排版、绘制、渲染)。 38 39 - 负责运行ArkWeb执行引擎(JavaScript、Web Assembly)。 40 41 - 提供接口供应用选择多Web实例间是否共享渲染进程,满足不同场景对安全性、稳定性、内存占用的诉求。 42 43 - 默认策略:移动设备上共享渲染进程以节省内存,2in1设备上独立渲染进程提升安全与稳定性。 44 45- Web GPU进程(应用唯一) 46 47 负责光栅化、合成送显等与GPU、RenderService交互功能。提升应用进程稳定性、安全性。 48 491. 可通过[setRenderProcessMode](../reference/apis-arkweb/arkts-apis-webview-WebviewController.md#setrenderprocessmode12)设置渲染子进程的模式,从而控制渲染过程的单进程或多进程状态。 50 51 移动设备默认为单进程渲染,而2in1设备则默认采用多进程渲染。通过调用[getRenderProcessMode](../reference/apis-arkweb/arkts-apis-webview-WebviewController.md#getrenderprocessmode12)可查询当前的渲染子进程模式,其中枚举值0表示单进程模式,枚举值1对应多进程模式。若获取的值不在[RenderProcessMode](../reference/apis-arkweb/arkts-apis-webview-e.md#renderprocessmode12)枚举值范围内,则系统将自动采用多进程渲染模式作为默认设置。 52 53 ```ts 54 // xxx.ets 55 import { webview } from '@kit.ArkWeb'; 56 import { BusinessError } from '@kit.BasicServicesKit'; 57 58 @Entry 59 @Component 60 struct WebComponent { 61 controller: webview.WebviewController = new webview.WebviewController(); 62 63 build() { 64 Column() { 65 Button('getRenderProcessMode') 66 .onClick(() => { 67 let mode = webview.WebviewController.getRenderProcessMode(); 68 console.log("getRenderProcessMode: " + mode); 69 }) 70 Button('setRenderProcessMode') 71 .onClick(() => { 72 try { 73 webview.WebviewController.setRenderProcessMode(webview.RenderProcessMode.MULTIPLE); 74 } catch (error) { 75 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 76 } 77 }) 78 Web({ src: 'www.example.com', controller: this.controller }) 79 } 80 } 81 } 82 ``` 83 842. 可通过[terminateRenderProcess](../reference/apis-arkweb/arkts-apis-webview-WebviewController.md#terminaterenderprocess12)来主动关闭渲染进程。若渲染进程尚未启动或已销毁,此操作将不会产生任何影响。此外,销毁渲染进程将同时影响所有与之关联的其他实例。 85 86 ```ts 87 // xxx.ets 88 import { webview } from '@kit.ArkWeb'; 89 90 @Entry 91 @Component 92 struct WebComponent { 93 controller: webview.WebviewController = new webview.WebviewController(); 94 95 build() { 96 Column() { 97 Button('terminateRenderProcess') 98 .onClick(() => { 99 let result = this.controller.terminateRenderProcess(); 100 console.log("terminateRenderProcess result: " + result); 101 }) 102 Web({ src: 'www.example.com', controller: this.controller }) 103 } 104 } 105 } 106 ``` 107 1083. 可通过[onRenderExited](../reference/apis-arkweb/arkts-basic-components-web-events.md#onrenderexited9)来监听渲染进程的退出事件,从而获知退出的具体原因(如内存OOM、crash或正常退出等)。由于多个Web组件可能共用同一个渲染进程,因此,每当渲染进程退出时,每个受此影响的Web组件均会触发相应的回调。 109 110 ```ts 111 // xxx.ets 112 import { webview } from '@kit.ArkWeb'; 113 114 @Entry 115 @Component 116 struct WebComponent { 117 controller: webview.WebviewController = new webview.WebviewController(); 118 119 build() { 120 Column() { 121 Web({ src: 'chrome://crash/', controller: this.controller }) 122 .onRenderExited((event) => { 123 if (event) { 124 console.log('reason:' + event.renderExitReason); 125 } 126 }) 127 } 128 } 129 } 130 ``` 131 1324. 可通过[onRenderProcessNotResponding](../reference/apis-arkweb/arkts-basic-components-web-events.md#onrenderprocessnotresponding12)、[onRenderProcessResponding](../reference/apis-arkweb/arkts-basic-components-web-events.md#onrenderprocessresponding12)来监听渲染进程的无响应状态。 133 134 当Web组件无法处理输入事件,或未能在预期时间内导航至新URL时,系统会判定网页进程为无响应状态,并触发onRenderProcessNotResponding回调。在网页进程持续无响应期间,该回调可能反复触发,直至进程恢复至正常运行状态,此时将触发onRenderProcessResponding回调。 135 136 ```ts 137 // xxx.ets 138 import { webview } from '@kit.ArkWeb'; 139 140 @Entry 141 @Component 142 struct WebComponent { 143 controller: webview.WebviewController = new webview.WebviewController(); 144 145 build() { 146 Column() { 147 Web({ src: 'www.example.com', controller: this.controller }) 148 .onRenderProcessNotResponding((data) => { 149 console.log("onRenderProcessNotResponding: [jsStack]= " + data.jsStack + 150 ", [process]=" + data.pid + ", [reason]=" + data.reason); 151 }) 152 } 153 } 154 } 155 ``` 156 157 ```ts 158 // xxx.ets 159 import { webview } from '@kit.ArkWeb'; 160 161 @Entry 162 @Component 163 struct WebComponent { 164 controller: webview.WebviewController = new webview.WebviewController(); 165 166 build() { 167 Column() { 168 Web({ src: 'www.example.com', controller: this.controller }) 169 .onRenderProcessResponding(() => { 170 console.log("onRenderProcessResponding again"); 171 }) 172 } 173 } 174 } 175 ``` 176 1775. [Web组件](../reference/apis-arkweb/arkts-basic-components-web.md)创建参数涵盖了多进程模型的运用。其中,sharedRenderProcessToken标识了当前Web组件所指定的共享渲染进程的token。在多渲染进程模式下,拥有相同token的Web组件将优先尝试重用与该token绑定的渲染进程。token与渲染进程的绑定关系,在渲染进程的初始化阶段形成。一旦渲染进程不再关联任何Web组件,它与token的绑定关系将被解除。 178 179 ```ts 180 // xxx.ets 181 import { webview } from '@kit.ArkWeb'; 182 183 @Entry 184 @Component 185 struct WebComponent { 186 controller1: webview.WebviewController = new webview.WebviewController(); 187 controller2: webview.WebviewController = new webview.WebviewController(); 188 189 build() { 190 Column() { 191 Web({ src: 'www.example.com', controller: this.controller1, sharedRenderProcessToken: "111" }) 192 Web({ src: 'www.w3.org', controller: this.controller2, sharedRenderProcessToken: "111" }) 193 } 194 } 195 } 196 ```