useNormalizedOHMUrl配置为true导致HAR包中创建Worker失败
===========================================

#### 问题现象

在entry模块调用harA的文件，harA中用@标识加载harB的Worker文件，运行闪退。

Reason:Signal:SIGABRT(SI\_TKILL)@0x01317b55000014a6 from:5286:20020053
LastFatalMessage:\[default\] \[LoadJSPandaFile:106\] resolveBufferCallback get hsp buffer failed, hsp path:/data/storage/el1/bundle/harA/ets/modules.abc, errorMsg:hap path error: /data/storage/el1/bundle/harA.hsp

harA中改用相对路径加载harB的Worker文件，运行依旧闪退。

const testWorker: worker.ThreadWorker = new worker.ThreadWorker('../../../../../harB/src/main/ets/workers/Worker.ets');

Reason:ReferenceError
Error name:ReferenceError
Error message:Cannot find module '@normalized:N&&&harB/src/main/ets/workers/Worker&1.0.0&1.0.0' imported from ''.

#### 背景知识

使用Worker模块具体功能时，须先构造Worker实例对象，其构造函数与API版本相关，且构造函数需要传入Worker线程文件的路径（scriptURL）。参考[文件路径注意事项](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/worker-introduction#文件路径注意事项)：

Stage模型下加载HAR中Worker线程文件存在以下两种情况：

*   @标识路径加载形式：所有种类的模块加载本地HAR中的Worker线程文件，加载路径规则：@{moduleName}/ets/{relativePath}。
*   相对路径加载形式：本地HAR加载该包内的Worker线程文件，加载路径规则：创建Worker对象所在文件与Worker线程文件的相对路径。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/23/v3/7ImyMjz8Rtai04hRm9fwbw/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260709T133813Z&HW-CC-Expire=86400&HW-CC-Sign=35F37B5D87B3F1FB8008B08CAE3EEEE8613B946DAA3AE5346740471A35A3F055)

当开启useNormalizedOHMUrl（即将工程目录中与entry同级别的应用级[build-profile.json5](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-hvigor-build-profile-app)文件中[strictMode](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-hvigor-build-profile-app#section13181758123312)属性的useNormalizedOHMUrl字段配置为true）或HAR包会被打包成三方包使用时，则HAR包中使用Worker仅支持通过相对路径的加载形式创建。

#### 问题定位

1.  根据报错信息创建Worker过程中路径不正确，对比文件路径注意事项中加载HAR中Worker线程文件场景，当开启useNormalizedOHMUrl或HAR包会被打包成三方包使用时，HAR包中使用Worker仅支持通过相对路径的加载形式创建。
2.  若使用相对路径加载Worker，检查创建Worker实例的文件与Worker文件本身是否在同一包内。

#### 分析结论

工程级build-profile.json5配置useNormalizedOHMUrl为true，仅支持通过相对路径的加载形式创建。创建Worker对象所在文件与Worker线程文件不在同一包内，导致用相对路径加载Worker无法识别。

#### 修改建议

当useNormalizedOHMUrl设置为true时需满足以下两个条件：

1.  使用相对路径引用Worker文件。
2.  创建Worker对象所在文件与Worker线程文件需在同一个包内。

*   在harB包Worker文件同一包内创建工具类，使用相对路径引用Worker文件，封装常用方法。
    
    import { worker } from '@kit.ArkTS';
    
    export class WorkerUtil {
     _ // 在worker文件同一包内创建实例_
      private testWorker: worker.ThreadWorker = new worker.ThreadWorker('../workers/WorkerTest.ets');
    
      postMsg(args: Object) {
        try {
        _  // 使用实例发送消息_
          this.testWorker.postMessage(args);
        } catch (error) {
        _  // Implement error handling._
        }
      }
    }
    
*   在harB模块根目录的Index.ets文件导出工具类。
    
    export { WorkerUtil } from './src/main/ets/workers/WorkerUtil';
    
*   在harA的oh-package.json5文件中引入harB依赖。
    
    {
      "name": "hara",
      "version": "1.0.0",
      "description": "Please describe the basic information.",
      "main": "Index.ets",
      "author": "",
      "license": "Apache-2.0",
      "dependencies": {
        "harb": 'file:../harB'
      }
    }
    
*   在harA调用方引入工具类，使用工具类实例对象调用常用方法。
    
    import { WorkerUtil } from 'harb';
    
    @Component
    export struct MainPage {
      build() {
        Row() {
          Column() {
            Text('Hello World')
              .fontSize($r('app.float.page\_text\_font\_size'))
              .fontWeight(FontWeight.Bold)
              .onClick(() => {
              _  // 创建harB的工具类WorkerUtil实例_
                let workerUtil: WorkerUtil = new WorkerUtil();
                workerUtil.postMsg(1);
              })
          }
          .width('100%')
        }
        .height('100%')
      }
    }
    

#### 常见FAQ

Q：在项目中引入ijkplayer实现录屏功能，引入ijkplayer本地HAR包后，编译时提示useNormalizedOHMUrl is not true，将该属性设置为true时，再打开项目时，整个项目直接出现白屏，无法进入到首页。报错信息如下：

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/30/v3/8XfbqsF4TOanDbuTjAqkyg/zh-cn_image_0000002659138347.png?HW-CC-KV=V1&HW-CC-Date=20260709T133813Z&HW-CC-Expire=86400&HW-CC-Sign=8A03F7300F6EC4EE65F2C1A15162CA3F1335AACE626CBC2E3340C2032ABA319E "点击放大")

A：根据报错信息分析得出是Worker路径不对，Worker使用有这样一个限制，当开启useNormalizedOHMUrl（在工程目录中与entry同级别的应用级build-profile.json5文件中，将strictMode属性下的useNormalizedOHMUrl字段配置为true）或HAR包被打包成三方包使用时，HAR包中使用Worker仅支持通过相对路径的加载形式创建。可参考Worker线程文件路径注意事项。