尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

HarmonyOS 7 新特性(二十四)|ModularObjectExtensionAbility 与 Taihe IPC

HarmonyOS 7 新特性(二十四)|ModularObjectExtensionAbility 与 Taihe IPC HarmonyOS 7API 26Beta2 新增基于 ModularObjectExtensionAbility 的模块化对象开发指导并提供使用 Taihe 生成 IPC 通信代码的路径。该能力涉及跨应用调用与 Native 接口接入时应以当前 C/C 指南和权限规则为准。很多团队希望把文档转换、媒体处理或专业计算能力开放给其他应用却容易走向两个极端要么复制同一套代码到多个工程要么暴露过大的远程服务接口。模块化对象模型提供了更清晰的边界服务端把特定功能封装为独立模块并暴露 Proxy客户端通过连接获得对象并跨进程调用。本文以“文档应用开放 PDF 转换能力”为例拆解接口设计、连接生命周期、Taihe 代码生成、身份校验、超时和版本兼容。一、先判断是否真的需要跨应用同一应用内部复用优先使用 HAR/HSP 或普通领域模块跨设备调用应评估分布式能力只有当独立应用需要调用受控功能且服务端必须保留实现与资源所有权时才适合 ModularObjectExtensionAbility。跨应用会引入进程死亡、权限、序列化、版本和调试成本。不要为了“架构高级”把简单函数变成 IPC。二、四个核心角色官方模型包含服务端、客户端、Stub 和 Proxy。服务端 Extension 创建 Stub 处理请求系统把它转换成客户端可用的 Proxy客户端通过 Connect 建立连接通过 Disconnect 结束生命周期。Client App - Connect(bundleName/moduleName/abilityName) - Proxy.convert(request) System IPC - Stub.onConvert(request) - Domain Service - structured resultProxy 与 Stub 是通信边界复杂业务逻辑应放在领域服务中。三、接口先做窄而稳定interfaceConvertRequest{requestId:stringsourceUri:stringtargetFormat:pdf|pngoptions:{quality:standard|highpageRange?:string}}typeConvertResponse|{ok:true;requestId:string;outputUri:string;sha256:string}|{ok:false;requestId:string;code:string;retryable:boolean}不要传递任意文件路径或让客户端控制服务端内部目录。输入使用受控 URI输出返回只读或有时效的 URI。四、版本字段不可省略客户端和服务端可能独立升级。每个协议声明主版本、次版本与能力列表连接成功后先协商再调用具体方法。interfaceModuleHandshake{protocolMajor:numberprotocolMinor:numbercapabilities:string[]maxPayloadBytes:number}functionisCompatible(local:ModuleHandshake,remote:ModuleHandshake):boolean{returnlocal.protocolMajorremote.protocolMajor}新增可选字段通常兼容改变字段语义或删除方法属于破坏性变化应提升主版本并保留迁移期。五、Taihe 生成代码仍要审查Taihe 可以减少手写 IPC 样板但生成代码不是业务正确性的证明。审查重点包括类型映射是否正确、错误码是否完整、对象所有权由谁释放、连接断开回调是否覆盖、生成文件是否能稳定再生。将接口定义文件纳入版本控制把生成命令固定到构建脚本。不要直接修改生成文件否则下次再生会丢失修改。contracts/ document_converter.taihe generated/ document_converter_proxy.* document_converter_stub.* service/ converter_domain_service.*六、连接管理是状态机每次连接会创建新的 Extension 实例。客户端必须处理连接中、已连接、断开、服务端死亡和重试。typeConnectionState|{kind:idle}|{kind:connecting;attempt:number}|{kind:ready;sessionId:string}|{kind:disconnected;reason:string}classModuleConnection{state:ConnectionState{kind:idle}privatependingnewMapstring,AbortController()disconnect(reason:string){for(consttaskofthis.pending.values())task.abort()this.pending.clear()this.state{kind:disconnected,reason}}}页面销毁不一定代表共享连接应立即断开应由应用级连接管理器统一所有权。七、跨进程请求必须有超时和幂等服务端可能繁忙或进程被系统回收。请求携带稳定requestId服务端对重复请求返回已有结果或明确状态。客户端超时后不能假设任务没有执行。asyncfunctioncallWithTimeoutT(job:PromiseT,timeoutMs:number):PromiseT{consttimeoutnewPromisenever((_,reject)setTimeout(()reject(newError(IPC_TIMEOUT)),timeoutMs))returnPromise.race([job,timeout])}耗时转换最好返回任务句柄并提供查询接口避免单个 IPC 长时间占用。八、安全校验放在服务端服务端验证调用方身份、能力授权、输入 URI、大小、格式和调用频率。客户端界面上的禁用按钮不能替代服务端校验。敏感动作应要求用户可感知确认临时文件使用隔离目录并按任务清理日志只记录请求 ID 和错误码不记录文档内容。九、失败和回退客户端无法连接时可提示安装/升级服务提供方或回退到本地轻量能力。版本不兼容应返回明确错误并引导升级不能无限重连。服务端重启后未完成任务需要根据持久化策略恢复或标记失败。中间文件必须能被定期清理防止断点任务占满存储。十、验证矩阵describe(module protocol,(){it(rejects a different major version,(){expect(isCompatible(v1Client,v2Server)).toBe(false)})it(deduplicates the same request id,async(){awaitservice.convert(request)awaitservice.convert(request)expect(worker.callCount).toBe(1)})})真机覆盖首次连接、并发调用、服务端被杀、客户端后台、权限拒绝、超大文件、协议不兼容和断开重连。十一、上线清单已证明跨应用调用的必要性接口窄、结构化、带版本与稳定错误码Taihe 生成物可重复生成且未手改连接、断开与服务端死亡都有处理请求有超时、幂等和迟到结果策略服务端完成身份、URI、大小与频率校验临时文件、日志和连接都有明确生命周期。结语模块化对象的价值在于“安全开放一个明确能力”而不是把整个应用变成远程对象。用稳定契约约束 Proxy/Stub用连接状态机处理进程不可靠性再让 Taihe 负责可生成的通信样板跨应用能力才能长期演进。官方参考模块化对象模型概述https://developer.huawei.com/consumer/cn/doc/doccenter-capabilities/modular-object-extension-overview模块化对象开发指导https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/modular-object-extension-ability
返回列表