文档管理中心
您当前正在浏览新版开发者文档中心,目录分类和层级有所调整。点击左侧当前文档分类名称前的“☰”图标,可切换文档分类。 了解新版目录
指南与API参考指南应用框架Ability Kit(程序框架服务)应用模型进程模型独立进程开发指导

独立进程开发指导

概述

在多模块应用开发场景中,开发者常面临模块间相互影响、异常传播导致整体崩溃等问题。进程隔离机制允许开发者将不同功能模块配置到独立进程中运行,实现模块间的进程隔离,提升应用的稳定性和安全性。该机制适用于需要模块隔离、故障隔离、安全隔离等场景。

进程隔离包括静态指定进程、动态指定进程和模块独立进程三种方式,开发者可根据进程分配时机和隔离粒度按需选择。

静态指定进程

场景介绍

静态指定进程适用于在编译期就能确定进程分配的场景,例如将某些功能组件隔离到独立进程中运行,提高应用的稳定性和安全性。当同一应用中的多个UIAbility或EmbeddedUIExtensionAbility需要运行在不同进程时,开发者可以通过配置module.json5配置文件中的abilities标签或extensionAbilities标签中的process字段静态指定所要运行的进程。系统在启动UIAbility或EmbeddedUIExtensionAbility时,会根据process字段分配进程。

典型场景包括:

  • 隔离高风险功能模块:适用于包含第三方渲染引擎、复杂编解码、JNI调用等稳定性风险较高的功能模块。
  • 复用关联组件进程:适用于多个职责相近、需要稳定共存的UIAbility。通过为它们指定相同的process字段,使这些UIAbility运行在同一进程中共享资源。如设置、个人中心、帮助中心等页面。
  • 隔离嵌入式UI扩展:适用于通过EmbeddedUIExtensionAbility向其他应用提供嵌入式UI组件的场景。

约束限制

  • 静态指定进程仅对UIAbility和EmbeddedUIExtensionAbility生效。
  • 静态指定进程仅支持在PC/2in1和Tablet设备类型上使用。
  • abilities标签或extensionAbilities标签中的process字段以":"开头表示应用私有进程,进程名的实际格式为"应用包名:指定字符串"。
  • 如果多个UIAbility和EmbeddedUIExtensionAbility的process字段配置为相同的字符串,则它们会运行在同一个进程内。

开发步骤

该示例代码以UIAbility为例介绍如何配置静态指定进程。在需要运行在独立进程的UIAbility的module.json5配置文件中,在abilities标签下对应的ability中添加process字段。process字段值以":"开头,表示应用私有进程。配置相同process字段值的多个ability将运行在同一进程中。以下示例中,EntryAbility未配置process字段,运行在默认进程中;EntryAbility1和EntryAbility2的process字段均配置为":processTag",它们将运行在同一独立进程中,进程名为"应用包名:processTag":

收起
自动换行
深色代码主题
复制
  1. {
  2. "module": {
  3. // ...
  4. "abilities": [
  5. // ...
  6. {
  7. "name": "EntryAbility1",
  8. "srcEntry": "./ets/entryability1/EntryAbility1.ets",
  9. // ...
  10. "process": ":processTag"
  11. },
  12. {
  13. "name": "EntryAbility2",
  14. "srcEntry": "./ets/entryability2/EntryAbility2.ets",
  15. // ...
  16. "process": ":processTag"
  17. }
  18. ],
  19. // ...
  20. }
  21. }

动态指定进程

场景介绍

动态指定进程适用于在运行阶段去动态确定运行进程的场景,例如将某些组件动态隔离到独立进程中运行,提高应用的稳定性和安全性。针对UIAbility实例,开发者需要将该UIAbility对应的abilities标签中的isolationProcess字段配置为true;系统在启动该UIAbility实例时,主控进程会触发onNewProcessRequest回调方法返回用于标识独立进程的字符串。UIAbility所运行的独立进程名称的拼接规则为"包名:onNewProcessRequest回调方法返回的字符串"。如果返回的字符串是开发者曾创建过的,则复用该标识所对应的进程,否则创建新的进程。

典型场景包括:

  • 多账号/多租户隔离:适用于同一应用同时服务多个账号、租户、工作空间等场景。
  • 多文档/多实例动态分配:适用于文档编辑、多标签页浏览等需要按文档或会话维度管理实例的场景。
  • 基于运行时上下文的进程决策:适用于根据数据安全等级、内容来源、用户配置等启动时信息决定进程归属的场景。

约束限制

  • 动态指定进程仅对UIAbility生效。
  • 动态指定进程仅支持在PC/2in1和Tablet设备类型上使用。

开发步骤

该示例代码以UIAbility为例介绍如何进行动态指定进程的开发。

  1. 配置动态指定进程。

    在module.json5配置文件中进行两项配置:首先在配置文件标签下通过srcEntry指定AbilityStage源文件路径;然后在abilities标签下为需要动态指定进程的UIAbility添加isolationProcess字段并设为true。

    以下示例中,名为EntryAbility1的UIAbility实例配置了isolationProcess为true,其运行进程由AbilityStage的onNewProcessRequest回调方法返回的字符串动态指定

    收起
    自动换行
    深色代码主题
    复制
    1. {
    2. "module": {
    3. // ...
    4. "srcEntry": "./ets/MyAbilityStage/MyAbilityStage.ets",
    5. // ...
    6. "abilities": [
    7. // ...
    8. {
    9. "name": "EntryAbility1",
    10. "srcEntry": "./ets/entryability1/EntryAbility1.ets",
    11. // ...
    12. "isolationProcess": true
    13. }
    14. ],
    15. // ...
    16. }
    17. }
  2. 实现AbilityStage的onNewProcessRequest回调方法。

    在srcEntry指定的AbilityStage源文件中,实现onNewProcessRequest回调方法。系统在启动配置isolationProcess为true的UIAbility实例时会触发该回调方法,然后根据该方法返回的字符串来动态地指定UIAbility实例所运行的独立进程。

    收起
    自动换行
    深色代码主题
    复制
    1. import AbilityStage from '@ohos.app.ability.AbilityStage';
    2. export default class MyAbilityStage extends AbilityStage {
    3. // ...
    4. onNewProcessRequest(want: Want): string {
    5. //返回开发者自定义的字符串,独立进程名称拼接规则:包名:开发者自定义的字符串
    6. return 'testKey';
    7. }
    8. }

模块独立进程

场景介绍

对于多HAP的应用,不同HAP可能承载不同的业务功能。当各HAP的业务相对独立、需要隔离运行时,开发者可以通过配置模块独立进程,使不同HAP的UIAbility运行在不同的进程中(进程名格式为"应用包名:模块名"),实现业务隔离,避免一个模块的异常影响其他模块的运行。

典型场景包括:

  • 多HAP业务隔离:适用于按业务域拆分为多个HAP的应用,如即时通讯、音视频会议、文档协作等业务模块。
  • 特性模块隔离:适用于承载相对独立功能的动态特性模块,使特性模块与主应用解耦。

约束限制

  • 仅对UIAbility生效。
  • 仅支持在PC/2in1和Tablet设备类型上使用。
  • 配置isolationMode为isolationOnly时,该HAP中的UIAbility只会在独立进程中运行,不会在主进程中运行。

开发步骤

当需要将同一HAP的UIAbility运行在独立进程时,需HAP模块的module.json5配置文件中的配置文件标签下添加isolationMode字段,将其配置为"isolationOnly"或"isolationFirst"。

以下示例以entry模块配置isolationOnly模式为例:

收起
自动换行
深色代码主题
复制
  1. {
  2. "module": {
  3. "name": "entry",
  4. // ...
  5. "isolationMode": "isolationOnly",
  6. // ...
  7. "abilities": [
  8. // ...
  9. ],
  10. "extensionAbilities": [
  11. // ...
  12. ]
  13. }
  14. }