文档管理中心
我的

HAR包中创建Worker失败问题定位

问题现象

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

收起
自动换行
深色代码主题
复制
  1. Reason:Signal:SIGABRT(SI_TKILL)@0x01317b55000014a6 from:5286:20020053
  2. 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文件,运行依旧闪退。

收起
自动换行
深色代码主题
复制
  1. const testWorker: worker.ThreadWorker = new worker.ThreadWorker('../../../../../harB/src/main/ets/workers/Worker.ets');
收起
自动换行
深色代码主题
复制
  1. Reason:ReferenceError
  2. Error name:ReferenceError
  3. Error message:Cannot find module '@normalized:N&&&harB/src/main/ets/workers/Worker&1.0.0&1.0.0' imported from ''.

定位过程

  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文件,封装常用方法;
    收起
    自动换行
    深色代码主题
    复制
    1. import { worker } from '@kit.ArkTS';
    2. export class WorkerUtil {
    3. // 在worker文件同一包内创建实例
    4. private testWorker: worker.ThreadWorker = new worker.ThreadWorker('../workers/WorkerTest.ets');
    5. postMsg(args: Object) {
    6. try {
    7. // 使用实例发送消息
    8. this.testWorker.postMessage(args);
    9. } catch (error) {
    10. // Implement error handling.
    11. }
    12. }
    13. }
  • 在harB模块根目录的Index.ets文件导出工具类;
    收起
    自动换行
    深色代码主题
    复制
    1. export { WorkerUtil } from './src/main/ets/workers/WorkerUtil';
  • 在harA的oh-package.json5文件中引入harB依赖;
    收起
    自动换行
    深色代码主题
    复制
    1. {
    2. "name": "hara",
    3. "version": "1.0.0",
    4. "description": "Please describe the basic information.",
    5. "main": "Index.ets",
    6. "author": "",
    7. "license": "Apache-2.0",
    8. "dependencies": {
    9. "harb": 'file:../harB'
    10. }
    11. }
  • 在harA调用方引入工具类,使用工具类实例对象调用常用方法。
    收起
    自动换行
    深色代码主题
    复制
    1. import { WorkerUtil } from 'harb';
    2. @Component
    3. export struct MainPage {
    4. build() {
    5. Row() {
    6. Column() {
    7. Text('Hello World')
    8. .fontSize($r('app.float.page_text_font_size'))
    9. .fontWeight(FontWeight.Bold)
    10. .onClick(() => {
    11. // 创建harB的工具类WorkerUtil实例
    12. let workerUtil: WorkerUtil = new WorkerUtil();
    13. workerUtil.postMsg(1);
    14. })
    15. }
    16. .width('100%')
    17. }
    18. .height('100%')
    19. }
    20. }