鸿蒙NEXT开辟【编译构建常见题目】

打印 上一主题 下一主题

主题 1035|帖子 1035|积分 3105

如何办理编译过程内存过高

题目现象
编译构建时,内存或CPU占用过高,导致出现DevEco Studio运行卡顿、延迟等现象。
办理措施


  • 在并行模式下执行hvigor构建,默认会有5个worker线程同时执行编译,且在编译的过程中,会在内存中添加一些缓存对象,用于提高后续增量编译的效率。
    可以在hvigor-config.json5中添加配置。
  1. "properties": {
  2.   // 配置为0,表示不启用内存缓存配置,默认为4,数值越低,内存中缓存数据越少
  3.   "hvigor.pool.cache.capacity": 0,
  4.   // 默认配置为cpu核数-1, 包含ohos.arkCompile.maxSize4,值越小,占用内存越少
  5.   "hvigor.pool.maxSize" : 5,
  6.   // 默认配置值为5, 值越小,占用内存越少
  7.   "ohos.arkCompile.maxSize": 3,
  8.   // 默认配置值为true, 表示开启内存缓存,占用内存较多,配置为false,关闭内存缓存,占用内存较少
  9.   "hvigor.enableMemoryCache": false
  10. },
复制代码
说明
当配置项"hvigor.pool.maxSize"和"ohos.arkCompile.maxSize"的值改小,"hvigor.enableMemoryCache"改为false后,大概会导致编译时长增长,请耐心等待。
  

  • 假如以上修改没有取得明显的效果,可以利用非并行的模式来执行编译。

    • 在菜单栏点击“File > Settings > Build, Execution, Deployment > Build Tools > Hvigor”,取消勾选“Execute tasks in parallel mode (may require larger heap size)”。

    • 流水线场景中,在命令行末了增长 --no-parallel,示例:
      1. hvigorw assembleHap --no-parallel
      复制代码
    说明
    利用非并行模式编译,内存占用会减少,但大概会导致编译时长增长,请耐心等待。

构建报错“Cannot read properties of undefined(reading ‘xxx’)”

题目现象
编译构建时,出现报错“Cannot read properties of undefined(reading ‘xxx’)”。
办理措施
打开堆栈信息排查hvigorconfig.ts文件和hvigorfile.ts文件里的代码,内里是否利用了未界说的属性。
堆栈打开方法:项目根目录/hvigor/hvigor-config.json5文件中配置如下内容:
  1. "debugging": {
  2.   "stacktrace": true                /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */
  3. },
复制代码
假如上述文件中并未排查出题目,请及时向我们提单反馈。
请按照如下步骤举行操作:[提单链接],在线提单->HarmonyOS应用->应用工具平台->DevEco Studio。

构建报错“Duplicated files found in module xxx. This may cause unexpected errors at runtime”

题目现象
编译构建时,出现报错“Duplicated files found in module xxx. This may cause unexpected errors at runtime”。
题目原因是构建时存在不同版本的同名so文件。比如将har模块产物里的so文件拷贝到entry模块的libs目录下,这时har模块里有一个libhar.so,entry模块里也有一个libhar.so,再配置entry依赖har,构建entry就会出现报错。

办理措施
利用select、pickFirsts、pickLasts等配置选中要利用的so文件; select提供native产物的精准选择能力,优先级高于excludes、pickFirsts等配置项。pickFirsts、pickLasts按照.so文件的优先级顺序,打包最高优先级的.so文件,优先级顺序是指依赖收集的顺序,越晚被收集优先级越高。
基于上面的例子,可以在entry的build-profile.json5中添加配置select选中har模块中的so文件,package选中包名为“har”的模块, include选中“libhar.so”文件。

构建报错“input module releaseType is different”

题目现象
打包APP时,提示“input module releaseType is different”。

办理措施
根据报错日志的Warning信息所提示的模块名称,查抄模块间的apiReleaseType字段是否一致。
该apiReleaseType字段由编译构建工具自动生成,保存在HAP/HSP包的module.json文件中。如下图所示,起首确认各模块间该字段是否一致,假如存在不一致的情况,需要将应用的各个模块,利用相同版本的SDK重新打包,然后打包APP。

构建报错“debug is different”

题目现象
打包APP时,提示“debug is different”。

办理措施
根据报错日志的Warning信息所提示的模块名称,查抄模块间的debug字段是否一致,尤其需要关注当地模块和外部引用模块之间是否一致。
1.该debug字段由编译构建工具自动生成,保存在HAP/HSP包的module.json文件中,如下图所示,起首确认各模块间该字段是否一致。

2.编译工具根据设置的Build Mode选项生成debug标识,如图所示,可以通过此处举行设置。

构建报错“proxy data is duplicated”

题目现象
打包APP时,提示“uri datashareproxy://bundleName/** in proxy data is duplicated”。

办理措施
proxyData标识模块提供的数据代理列表,只允许entry和feature配置,不同的proxyData中配置的URI不可重复。遇到此题目,查抄模块间是否配置了相同uri的proxyData。

编译报错“Init keystore failed: parseAlgParameters failed: ObjectIdentifier()”

题目现象
编译构建时,出现错误:Init keystore failed: parseAlgParameters failed: ObjectIdentifier()。
  1. hap-sign-tool: error: ACCESS_ERROR, code: 109. Details:   Init keystore failed: parseAlgParameters failed: ObjectIdentifier() -- data isn't an object ID (tag = 48)   Detail: Please check the message from tools
复制代码
错误原因
利用高版本JDK生成密钥对(p12),再利用低版本的JDK执行署名命令时,会由于不兼容导致解析p12失败,从而署名失败。
场景

  • 利用DevEco Studio生产密钥对时,DevEco Studio默认会调用软件内预置的JDK17,而用户利用当地的低版本JDK举行署名时则会报错。
  • 用户当地利用高版本JDK生成密钥对时,又通过DevEco Studio举行署名,DevEco Studio中预置的JDK17版本低于用户的JDK,导致报错。
办理方案
请查抄当前利用的JDK版本和生产密钥对利用的JDK版本,利用版本匹配的JDK执行署名命令。
编译报错“generate SignerBlock failed”

题目现象
编译构建时,出现错误:message:generate SignerBlock failed。
  1. hap-sign-tool: error: {errorcode:0,message:generate SignerBlock failed}
复制代码
错误原因
署名用的公私钥对不匹配,利用私钥署名后,用公钥验签失败。需保证私钥(keyalias)和公钥(appCertPath)配对利用。
场景

  • 当地生产署名材料时,未导出正确的keyalias对应的csr(证书请求文件),导致生成证书时,公钥与keyalias对应的私钥不匹配。
  • 署名过程参数填写错误,利用了错误的keyalias大概appCertPath文件。
办理方案
请选择正确、配对的keyalias和appCertPath文件。
编译报错“java.io.IOException: DerValue.getOID, not an OID 49”

题目现象
编译构建时,出现错误:java.io.IOException: DerValue.getOID, not an OID 49。
  1. hap-sign-tool: error: ACCESS_ERROR, code: 109. Details: java.io.IOException: DerValue.getOID, not an OID 49 Detail: Please check the message from tools
复制代码
报错原因
证书文件解析失败,找不到证书的OID。
场景

  • 证书被篡改。
  • appCertPath参数中传入了非证书文件。
办理方案
请查抄证书文件是否正确。
编译报错“JS heap out of memory”

题目现象
编译构建时,出现报错“JS heap out of memory“。

办理措施
出现该报错的原因是hvigor运行时内存不足,在利用3.1.0及以上版本的hvigor时,可通过以下方式修改hvigor运行时内存的最大值。
勾选Enable the Daemon for tasks:

在hvigor-config.json5中修改maxOldSpaceSize字段,根据工程的大小,适当将其增大(如设置为8192):
  1. "nodeOptions": {
  2.   "maxOldSpaceSize": 8192
  3. }
复制代码
Linux环境下编译报错“JS heap out of memory”

题目现象
在Linux环境下,系统内存有64G,Hvigorw脚本中配置–max-old-space-size=40960,在编译构建时,现实在利用内存未达到配置的内存(例如利用到20G左右)就出现报错“JS heap out of memory“。
  1. FATAL ERROR: NewSpace::Rebalance Allocation failed - JavaScript heap out of memory
  2. Writing Node.js report to file: report.20200512.172528.47517.24.011.json
  3. Node.js report completed
  4. 1: 0xa295e0 node::Abort() [node]
  5. 2: 0x9782df node::FatalError(char const*, char const*) [node]
  6. 3: 0xb99c2e v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [node]
  7. 4: 0xb99fa7 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [node]
  8. 5: 0xd3a3b5 [node]
  9. 6: 0xd74f27 [node]
  10. 7: 0xd84707 v8::internal::MarkCompactCollector::CollectGarbage() [node]
  11. 8: 0xd481b9 v8::internal::Heap::MarkCompact() [node]
  12. 9: 0xd48f0b v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [node]
  13. 10: 0xd499a5 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node]
  14. 11: 0xd4aebf v8::internal::Heap::HandleGCRequest() [node]
  15. 12: 0xcf5f97 v8::internal::StackGuard::HandleInterrupts() [node]
  16. 13: 0x104b803 v8::internal::Runtime_StackGuard(int, unsigned long*, v8::internal::Isolate*) [node]
  17. 14: 0x13a5a99 [node]
  18. Aborted (core dumped)
复制代码
题目原因
vm.max_map_count是一个与内核虚拟内存子系统相关的参数,用于控制进程可以拥有的内存映射区域的最大数量。它通常用于限制一个进程可以打开的文件数量,特别是在利用大量内存映射文件的情况下。
在Linux系统上,vm.max_map_count参数的默认值通常是较小的数值,例如65530。然而,对于一些需要大量内存映射的应用步调大概特定的利用场景,大概需要增长该参数的值,以便支持更多的内存映射区域。
办理措施
修改vm.max_map_count的值:


  • 临时修改:
    1. sysctl -w vm.max_map_count=新值
    复制代码
  • 永世修改:假如盼望永世修改参数的值,可以编辑/etc/sysctl.conf文件,并添加或修改以下行:
    1. vm.max_map_count=新值
    复制代码
    保存文件后,利用以下命令使更改生效:
    1. sysctl -p
    复制代码
编译报错“Cannot find module XXX or its corresponding type declarations”



  • 场景一:
    题目现象
    Stage模板工程编译引用native文件(.so) 提示 “Cannot find module XXX or its corresponding type declarations.”。
    处置惩罚措施
    当前Stage工程在编译构建阶段新增对native文件(.so)导出符号的语法校验,假如引用了没有对应声明文件(.d.ts)的native文件(.so)的现有工程在编译构建阶段,语法校验工具便会报错提示找不到对应的声明文件。
    假如出现类似题目,可尝试通过如下方式举行办理:

    • 在对应cpp目录下新建types/libxxx目录,并在该目录下新增index.d.ts用于声明native的范例符号;新增oh-package.json5配置文件用于校验工具的模块查询。


    • 在native引用的模块内的oh-package.json5中添加native模块的当地依赖,并根据IDE提示点击Sync Now同步工程,下图以entry模块引用native模块为例。


  

  • 场景二:
    题目现象
    引用三方包,构建失败,提示“Cannot find module ‘xxx’ or its corresponding type declarations”。

    处置惩罚措施
    进入对应模块级oh-package.json5文件或工程级oh-package.json5文件中查看三方包是否已安装,若未安装,需执行ohpm install安装;若已安装,需查看“main”字段是否配置正确,若未配置或配置错误,需配置为正确的入口文件。
  • 场景三:
    题目现象
    引用的包路径被肴杂,代码中又是在引用包后面拼接了路径,导致模块引用不到而报错。
    例如:

    代码中这样引用

    这样引用会找不到模块,导致报错。
    处置惩罚措施
    修改引用方式,改为推荐的引用方式。

  • 场景四:
    题目现象
    被引用模块oh_package.json5配置有误,执行了ohpm install 而且成功地安装了依赖,但是还报错模块找不到。

    被引用模块的 oh_package.json5 中配置了错误的types字段。
    该字段优先于main字段。 假如 types 字段配置的不存在,就会报错模块找不到。

    处置惩罚措施
    假如该包中没有d.ets声明,则这个字段可以删除。配置不存在大概错误,会导致报错。
  • 场景五:
    题目现象
    oh_package.json5 中 dependencies 中引入模块的 名称 和 现实利用时 import 的 不一致。
    例如 在 oh_package.json5 中这样引入:
    1. "dependencies": {   "har": "file:../har" }
    复制代码
    但是现实上在代码中import 的时间是 大写 HAR 大概其他而不是 dependencies 内里配置的 ‘har’ 的值,要留意保持完全一致。(目前windows 没有题目,linux会报错模块找不到)
    处置惩罚措施
    引入和利用改成一致。
  • 场景六:
    题目现象
    引用模块的 oh_package.json5 中 main 字段值和现实的文件名称大小写不一致。
    处置惩罚措施
    将main字段和现实文件名称的大小写改为一致。
  • 场景七:
    题目现象
    Stage模板工程编译构建失败,提示 “Cannot find module ‘@bundle:rollup_plugin_ignore_empty_module_placeholder’ or its corresponding type declarations”。

    办理措施
    该题目是由于工程引用了无对应实现文件的.d.ts声明文件:

    • 通过在build目录中搜索’rollup_plugin_ignore_empty_module_placeholder’,找到报错的中间文件,并根据中间文件找到对应工程文件。

      在输入栏中输入rollup_plugin_ignore_empty_module_placeholder,找到题目模块的中间文件。

          

    • 在引用范例文件中通过添加type显式声明符号范例引用:
      1. export type {T} from './type';
      复制代码

          

    • 同时排查是否从d.ts/d.ets中引用值范例符号,克制在声明文件中声明值变量。


编译报错“Module ‘xxx’ has no exported member ‘yyy’”

题目现象
Stage模板工程编译构建失败,提示 “Module ‘xxx’ has no exported member ‘yyy’” 而且"yyy"符号是由export * from 'x.js’语法从js文件中导出。
处置惩罚措施
当前Stage工程编译构建期的语法校验工具对js文件不作查抄,因此当利用export * from 'x.js’导出js文件中的符号时,符号引用处便会提示"Module ‘xxx’ has no exported member ‘yyy’"的错误信息。
假如出现类似题目,可尝试通过如下方式举行办理:


  • 方法1(推荐利用): 利用符号显式导出语法,从js文件中re-export符号 。
    1. export { yyy } from 'x.js'
    复制代码
  

  • 方法2:新增x.js对应的声明文件(.d.ts),并在引用时不指定后缀。

编译报错“Could not load ${file1} (imported by ${file2}): Maximum call stack size exceeded”

题目现象
Stage模板工程编译构建失败,提示 “ERROR: Could not load ${file1} (imported by ${file2}): Maximum call stack size exceeded”。

处置惩罚措施
该题目是由于file1为当前工程外的代码:

请新建Static Library模块,并将工程外的代码迁徙至Static Library模块内,并利用HAP引用HAR方式举行模块间引用。
编译报错“Failed to get a resolved OhmUrl by filepath xx”



  • 场景一:
    题目现象
    三方包在配置依赖时,配置到devDependencies,源码中又有引用依赖中的API时,编译失败。如以下示例:三方包@hms-security/ucs-appauth将依赖@network/gr配置在devDependencies中,源码中利用了@network/grs的API时,编译失败,提示“ERROR: ArkTS:ERROR Failed to get an resolved OhmUrl by filepath xxx”。

    题目确认

    • 进入上面报黄色的源码文件中,可以看到依赖有红色告警信息。

    • 进入包下的oh-package.json5文件,查看依赖配置为devDependencies。

    处置惩罚措施
       

    • 向此包开辟团队提改进建议:运行时的依赖,不能配置在devDependencies中。
    • 可在依赖上层引入对应devDependencies中的三方包规避此题目。

  

  • 场景二:
    题目现象
    DevEco Studio编译失败,提示“ERROR: ArkTS:ERROR Failed to get a resolved OhmUrl by filepath xxx”。

    题目确认
    查看工程目录下的build-profile.json5文件中modules字段配置的srcPath路径是否与真实路径不相同,是否存在大小写不一致题目。
    处置惩罚措施
    将工程目录下的build-profile.json5文件中modules字段配置的srcPath路径与真实路径保持一致。
  • 场景三:
    题目现象
    工程A以相对路径引用了工程B的模块,这种引用会导致报错。



    处置惩罚措施

    • 把工程B这种的har转至工程A里,作为A的一个模块引用。
    • 把工程B的har提前打包,在A中 以.har的方式引用。
    • 上传到堆栈,以版本号的方式引用。

  • 场景四:
    题目现象
    DevEco Studio编译失败,提示“Error Message: Failed to get a resolved OhmUrl for ‘hvigor_ignore_xxxxx’ imported by xxx”。
    处置惩罚措施
    假如hvigor_ignore_xxxxx地点的模块是一个har模块,需要排查oh_package.json5中是否存在"packageType": “InterfaceHar”,假如存在,请删除"packageType": “InterfaceHar”。
  • 场景五:
    题目现象
    DevEco Studio编译失败,提示“Failed to get a resolved OhmUrl for ‘xxx’ imported by ‘yyy’”。

    题目确认

    • 排查yyy地点模块是否为字节码har,查看工程级build-profile.json5的useNormalizedOHMUrl是否为true(缺省默认值为false),假如为true则默认构建字节码har。
    • 假如yyy地点模块是字节码har,请排查xxx依赖是否被配置在工程级oh_package.json5的dependencies,但没有配置在yyy模块级oh_package.json5的dependencies中。
    处置惩罚措施
       

    • 将xxx依赖配置到yyy模块oh_package.json5的dependencies中。

    • 将yyy模块改为非字节码har,在模块级build-profile.json5文件中添加byteCodeHar字段并设置为false。

  1. "buildOption": {
  2.   "arkOptions": {
  3.     "byteCodeHar": false
  4.   }
  5. }
复制代码


  • 场景六:
    请确认当前利用的DevEco Studio和SDK版本是配套的,点击菜单栏Help > About DevEco StudioHelp > About HarmonyOS SDK分别查看配套的DevEco Studio和SDK版本。

  • 场景七:
    题目现象:
    DevEco Studio编译失败,提示 “ERROR: ArkTS:ERROR failed to execute es2abc ERROR: ArkTS:ERROR Failed to get a resolved OhmUrl by filepath xxx”。

    处置惩罚措施
    该题目是由于在工程中引用了非工程标准模块目录(即目录内无模块描述文件module.json5),如下图utils目录所示:

    请新建Static Library模块,并将utils/common内里的代码迁徙至Static Library模块内,并利用HAP引用HAR方式举行模块间引用。
编译报错“Property xxx does not exist on type ‘typeof BuildProfile’.”

题目现象 1
利用了自界说参数BuildProfile,编译态无非常但编译构建失败,提示“Property xxx does not exist on type ‘typeof BuildProfile’.”。

处置惩罚措施
查抄在当前模块下build-profile.json5中的targets > buildProfileFields配置的自界说参数中key值是否相同,假如不同请将targets内所有buildProfileFields中的key值保持相同。
以下为导致编译报错的错误配置示例:
  1. "targets": [
  2.   {
  3.     "name": "default",
  4.     "config": {
  5.       "buildOption": {
  6.         "arkOptions": {
  7.           "buildProfileFields": {
  8.             "targetName": "default"
  9.           }
  10.         }
  11.       }
  12.     }
  13.   },
  14.   {
  15.     "name": "default1",
  16.     "config": {
  17.       "buildOption": {
  18.         "arkOptions": {
  19.           "buildProfileFields": {
  20.             "targetName1": "default1"
  21.           }
  22.         }
  23.       }
  24.     }
  25.   },
  26. ]
复制代码
请将targets内所有buildProfileFields中的key值修改一致,如以下示例:
  1. "targets": [
  2.   {
  3.     "name": "default",
  4.     "config": {
  5.       "buildOption": {
  6.         "arkOptions": {
  7.           "buildProfileFields": {
  8.             "targetName": "default"
  9.           }
  10.         }
  11.       }
  12.     }
  13.   },
  14.   {
  15.     "name": "default1",
  16.     "config": {
  17.       "buildOption": {
  18.         "arkOptions": {
  19.           "buildProfileFields": {
  20.             "targetName": "default1"
  21.           }
  22.         }
  23.       }
  24.     }
  25.   },
  26. ]
复制代码
题目现象2
利用了自界说参数BuildProfile而且编译器标红且构建失败,提示“Property xxx does not exist on type ‘typeof BuildProfile’.”。

处置惩罚措施
请查抄当前模块下build-profile.json5中buildProfileFields内是否添加了所利用的自界说参数,请确保该自界说参数已配置在buildProfileFields内。
C++工程编译导致电脑卡顿的处置惩罚建议

题目现象
在执行代码规模较大的C++工程的编译时,由于C++编译时的CPU占用率较高,大概出现电脑卡顿、反应迟缓等现象。
处置惩罚措施
假如出现类似题目,可尝试通过如下方式举行办理:
打开模块下的build-profile.json5文件,在arguments参数中添加如下配置。并根据电脑CPU配置,修改compile和link的值。建议compile和link的值之和,设置为CPU核数的一半,如CPU为8核,则compile和link分别设置为2。
  1. "arguments": "-DCMAKE_JOB_POOL_COMPILE:STRING=compile -DCMAKE_JOB_POOL_LINK:STRING=link -DCMAKE_JOB_POOLS:STRING=compile=2;link=2",
复制代码
需要说明的是,修改了compile和link的值,大概会导致编译时长增长,请耐心等待。
CPP编译报错"A ‘undefined symbol’ error has occurred"

题目现象
在编译HarmonyOS C++ 项目时,报错提示"A ‘undefined symbol’ error has occurred"。
办理措施
"undefined symbol"错误通常表示链接器找不到特定符号的界说。这通常是由于源文件没有正确编译或链接,大概由于缺少须要的库文件。以下是如何定位和办理这个题目的步骤:

  • 确保所有源文件都已包罗在 CMake 构建中。
起首,查抄您的 CMakeLists.txt 文件,确保所有相关的源文件都已包罗在项目中。
示例 CMakeLists.txt
  1. cmake_minimum_required(VERSION 3.10)
  2. project(MyProject)  
  3. set(CMAKE_CXX_STANDARD 17)  
  4. include_directories(${CMAKE_CURRENT_SOURCE_DIR}                    
  5.                     ${CMAKE_CURRENT_SOURCE_DIR}/include)  
  6. # 添加所有源文件
  7. add_library(myProgram SAHRED main.cpp myLibrary.cpp)
复制代码

  • 确认源文件的符号界说。
确保在所有相关的源文件中正确界说了符号。例如,查抄 myLibrary.cpp 是否包罗 myFunction 的界说:
myLibrary.cpp
  1. #include "myLibrary.h"
  2. void myFunction() {     
  3. // Function implementation
  4. }
复制代码
myLibrary.h
  1. #ifndef MY_LIBRARY_H
  2. #define MY_LIBRARY_H
  3. void myFunction();  
  4. #endif
复制代码

  • 查抄编译和链接顺序。
确保所有源文件和库文件按照正确的顺序举行编译和链接。CMake 和 Ninja 通常会处置惩罚这个题目,但在手动编译时大概会出现题目。

  • 清理和重新生成构建文件。
偶然,构建文件大概会破坏或丢失符号界说。尝试清理构建目录并重新生成构建文件:
  1. hvigorw clean
  2. 1
复制代码
或手动删除模块下.cxx目录。

  • 查抄库路径和链接器标记。
假如利用三方库,确保 CMakeLists.txt 中正确配置了库路径和链接器标记。例如:
  1. cmake_minimum_required(VERSION 3.10)
  2. project(MyProject)  
  3. set(CMAKE_CXX_STANDARD 17)  
  4. # 确保添加三方库的头文件
  5. include_directories(${PATH_TO_EXTERNAL_LIBRARY}
  6.                     ${PATH_TO_EXTERNAL_LIBRARY}/include)  
  7. # 添加源文件
  8. add_library(myProgram SAHRED main.cpp myLibrary.cpp)  
  9. # 链接三方库
  10. target_link_libraries(myProgram PUBLIC /path/to/external/library)
复制代码

  • 启用详细编译和链接输出。
为相识详细的编译和链接过程,可以启用更详细的输出。在 CMakeLists.txt 中添加以下内容:
  1. set(CMAKE_VERBOSE_MAKEFILE ON)
复制代码

  • 查抄 Ninja 输出日志。
Ninja 默认生成 .ninja_log 文件,此中包罗构建过程的详细信息。您可以查抄这个日志文件以相识构建过程中的题目。
  1. cat {module}/.cxx/default/default/arm64-v8a/.ninja_log
复制代码
查抄编译日志中是否存在符号地点的源文件或头文件。

  • 利用 nm 工具查抄符号。
利用 nm 工具查抄目的文件和库文件中的符号,确保符号界说存在。
可利用sdk中内置的nm工具:sdk/default/openharmony/native/llvm/bin/llvm-nm。
查抄目的文件
  1. nm myLibrary.o | grep myFunction
复制代码
查抄三方库文件
  1. nm /path/to/external/library | grep myFunction
复制代码
结论
通过上述步骤,您可以定位和办理 error: undefined symbol 题目。在利用 CMake、Ninja 和 LLVM 编译 C++ 项目时,确保所有源文件和库文件正确包罗在项目中,并正确配置编译和链接选项是关键。假如题目依旧存在,详细的编译和链接输出日志通常能提供更多线索,帮助您找到具体的原因。
CPP编译报错"A ‘unknown type name’ error has occurred"

题目现象
在编译HarmonyOS C++ 项目时,报错提示"A ‘unknown type name’ error has occurred"。
办理措施
在编译HarmonyOS C++ 项目时,遇到"unknown type name"错误通常表示编译器无法辨认某个范例。这大概是由于范例未界说、未包罗相关的头文件,大概包罗的头文件路径不正确。以下是定位和办理这个题目的步骤:

  • 查抄头文件包罗。
确保所有须要的头文件都已正确包罗在源文件中。例如,假如您正在利用某个自界说范例或库提供的范例,请确保在利用该范例的文件中包罗了相关的头文件。
示例:
  1. // main.cpp
  2. #include "myLibrary.h"
  3. int main() {
  4.      MyType obj;
  5.      // 使用自定义类型
  6.      return 0;
  7. }
  8. // myLibrary.h
  9. #ifndef MY_LIBRARY_H
  10. #define MY_LIBRARY_H
  11. class MyType {
  12. public:
  13.      MyType() {}
  14.      void doSomething();
  15. };
  16. #endif
复制代码

  • 查抄头文件路径。
确保 CMakeLists.txt 中正确设置了头文件的搜索路径。可以通过 include_directories 添加头文件目录。
示例 CMakeLists.txt:
  1. cmake_minimum_required(VERSION 3.10)
  2. project(MyProject)  
  3. set(CMAKE_CXX_STANDARD 17)  
  4. # 添加头文件目录
  5. include_directories(${CMAKE_SOURCE_DIR}/include)  
  6. # 添加源文件
  7. add_library(myProgram SHARED src/main.cpp src/myLibrary.cpp)
复制代码

  • 清理和重新生成构建文件。
偶然,构建文件大概会破坏或丢失符号界说。尝试清理构建目录并重新生成构建文件:
  1. hvigorw clean
复制代码
或手动删除模块下.cxx目录。

  • 启用详细编译输出。
为相识详细的编译过程,可以启用更详细的输出。在 CMakeLists.txt 中添加以下内容:
  1. set(CMAKE_VERBOSE_MAKEFILE ON)
复制代码

  • 查抄编译输出日志。
Ninja 默认生成 .ninja_log 文件,此中包罗构建过程的详细信息。你可以查抄这个日志文件以相识构建过程中的题目。
  1. cat .cxx/default/default/arm64-v8a/.ninja_log
复制代码

  • 利用 CMake 的 message 函数调试。
可以在 CMakeLists.txt 文件中添加 message 函数来打印一些调试信息,以确保路径和变量正确设置。
示例:
  1. message(STATUS "Source directory: ${CMAKE_SOURCE_DIR}")
  2. message(STATUS "Include directories: ${CMAKE_INCLUDE_PATH}")
复制代码
结论
通过上述步骤,您可以定位和办理 unknown type name 题目。在利用 CMake、Ninja 和 LLVM 编译 C++ 项目时,确保所有头文件正确包罗并设置正确的头文件路径是关键。假如题目依旧存在,详细的编译输出日志通常能提供更多线索,帮助您找到具体的原因。
JDK版本不匹配导致编译失败

题目现象
通过命令行方式构建HarmonyOS应用或元服务过程中出现构建失败,现象如下图所示。

办理措施
该题目是由于JDK版本不匹配导致,当前配套的版本为JDK 17。因此,请根据如下方法举行修正:

  • 下载并安装JDK 17版本。
  • 修改JAVA_HOME环境变量,取值修改为JDK 17。
LABEL_VALUE_ERROR处置惩罚引导

题目现象
在工程同步、编译构建过程中,提示LABEL_VALUE_ERROR错误信息。

办理措施
该题目是由于config.json文件的资源引用规则变动导致,需要将“label”字段的取值,修改为资源引用方式。

  • resources > base > element中的string.json中添加对应的字符串信息。
  • 然后在config.json中重新引用该字符串资源。

应用/服务的启动界面信息缺失,提示"Schema validate failed"报错

题目现象
在工程同步大概编译构建时出现错误,提示“Schema validate failed”。

办理措施
在开辟应用/服务时,可以设置应用/服务的启动界面的图标及背景颜色,创建工程后自动设置了默认的启动界面信息,但若开辟者误删此中某个字段后将导致报错。下面以重新设置启动界面信息为例,开辟者可自界说启动界面的图标及背景颜色。
在开辟应用/服务时,为了提升应用/服务冷启动的性能,您可以通过如下方式设置应用/服务的启动界面的图标及背景颜色。

  • 在模块下的resources > base > element下,点击右键选择New > Element Resource File创建资源文件。

  • 在弹出的对话框中,“File name”开辟者可自界说,如color;“Root element”请选择color。

    创建完成后,color.json文件如下图所示:

  • 将[2]创建的color.json文件拷贝至模块的ohosTest > resources > base > element目录下。

  • 在模块的src > main > module.json5文件的abilities数组中,添加startWindowIcon和startWindowBackground字段(若缺少任一字段,将出现ERROR: Schema validate failed报错)。此中,startWindowIcon字段索引模块下resources > base > media中的图标资源,startWindowBackground字段索引resources > base > element > color.json中的color。


  • src > ohosTest > module.json5文件的abilities数组中,加startWindowIcon和startWindowBackground字段。此中,startWindowIcon字段索引模块ohosTest下resources > base > media中的图标资源, startWindowBackground字段索引resources > base > element > color.json中的color。
编译报错“Schema validate failed”

题目现象
DevEco Studio编译时出现错误,提示“Schema validate failed”错误信息。
办理措施
出现该题目的原因是配置文件中字段缺失或拼写错误,可根据报错的详细信息举行题目定位。
如将module.json5文件中abilities标签中的“name”错写为“nam”,报错信息如下:
  1.      Detail: Please check the following fields.
  2. {
  3.   instancePath: 'module.abilities[0]',
  4.   keyword: 'required',
  5.   params: { missingProperty: 'name' },
  6.   message: "must have required property 'name'",
  7.   location: 'D:/MyApplication/entry/src/main/module.json5:15:8'
  8. }
  9. {
  10.   instancePath: 'module.abilities[0]',
  11.   keyword: 'required',
  12.   params: { missingProperty: 'srcEntrance' },
  13.   message: "must have required property 'srcEntrance'",
  14.   location: 'D:/MyApplication/entry/src/main/module.json5:15:8'
  15. }
  16. {
  17.   instancePath: 'module.abilities[0]',
  18.   keyword: 'required',
  19.   params: { missingProperty: 'name' },
  20.   message: "must have required property 'name'",
  21.   location: 'D:/MyApplication/entry/src/main/module.json5:15:8'
  22. }
  23. {
  24.   instancePath: 'module.abilities[0]',
  25.   keyword: 'oneOf',
  26.   params: { passingSchemas: null },
  27.   message: 'must match exactly one schema in oneOf',
  28.   location: 'D:/MyApplication/entry/src/main/module.json5:15:8'
  29. }
  30. {
  31.   instancePath: 'module.abilities[0]',
  32.   keyword: 'enum',
  33.   params: {
  34.     allowedValues: [
  35.       'priority',
  36.       'name',
  37.       'srcEntrance',
  38.       'srcEntry',
  39.       'launchType',
  40.       'description',
  41.       'icon',
  42.       'label',
  43.       'permissions',
  44.       'metadata',
  45.       'visible',
  46.       'exported',
  47.       'skills',
  48.       'backgroundModes',
  49.       'continuable',
  50.       'startWindowIcon',
  51.       'startWindowBackground',
  52.       'removeMissionAfterTerminate',
  53.       'orientation',
  54.       'supportWindowMode',
  55.       'maxWindowRatio',
  56.       'minWindowRatio',
  57.       'maxWindowWidth',
  58.       'minWindowWidth',
  59.       'maxWindowHeight',
  60.       'minWindowHeight',
  61.       'excludeFromMissions'
  62.     ]
  63.   },
  64.   message: 'must be equal to one of the allowed values',
  65.   location: 'D:/MyApplication/entry/src/main/module.json5:15:8'
  66. }
  67. {
  68.   instancePath: 'module.abilities[0]',
  69.   keyword: 'propertyNames',
  70.   params: { propertyName: 'nam' },
  71.   message: 'property name must be valid',
  72.   location: 'D:/MyApplication/entry/src/main/module.json5:15:8'
  73. }
复制代码
以上述报错为例,说明报错中关键词的寄义,便于开辟者明白报错信息,完成题目定位及修改。


  • instancePath:错误地点的文件位置。'module.abilities[0]'表示在module.json5文件中的第一个abilities。
  • keyword:标识当前报错字段的可选配属性,当前报错中包罗’required’、‘oneOf’、‘enum’、‘propertyNames’。

    • required:表示该字段为必选配置项。由于缺失或拼写错误导致该属性未配置。
    • oneOf:表示当前配置不符合oneOf要求。通过instancePath已经确认报错出现在abilities标签,在DevEco Studio中,按住Ctrl点击"abilities"跳转到对应的module.json文件,可以查看到必须配置以下两组中的一组。根据对比排查,可辨认到因拼写错误导致"name"属性未配置。

    • enum:该标签内所有可配置的属性。开辟者可根据罗列值确认属性的正确写法。
    • propertyNames:假如字段拼写错误将出现propertyNames,propertyName: 'nam’指明“nam”为错误属性。

  • params:不同keyword对应不同的详细说明,如keyword为’required’时,params的missingProperty: ‘name’ 表示缺失的属性为“name”。
  • message:修改要求的说明,如keyword为’required’时,message表示必须配置name属性。
  • location:错误的具体位置,点击可以跳转。
编译报错“No available entry module found”

题目现象
DevEco Studio编译时出现错误,提示“No available entry module found”错误信息。
办理措施
feature模块中需要配置依赖的entry模块,DevEco Studio在编译时会校验feature模块所依赖的entry模块是否存在,出现该题目的原因大概为以下情况:

  • 在feature模块的build-profile.json5文件中,entryModules字段配置的名称与现实entry模块的名称不一致。请将entryModules字段的值修改为entry模块的名称;
  • 在项目级build-profile.json5文件的modules字段中,feature模块位于entry模块之前。由于DevEco Studio在举行编译时会按照从前往后的顺序举行配置,当配置feature模块时,尚未读取和配置entry模块,则会报entry模块不存在的错误。请在modules字段中将feature模块置于所依赖的entry模块之后。
编译报错“keystore password was incorrect”

题目现象
DevEco Studio编译时出现错误,提示“ERROR - hap-sign-tool: error: ACCESS_ERROR, code: 109. Details: Init keystore failed: keystore password was incorrect”错误信息。

报错原因
密钥库(p12)密码错误。
留意
密钥库密码密钥密码是在创建p12文件时由开辟者自行输入的,请牢记该密码。DevEco Studio工程的build-profile.json5文件中有记载密码的密文,但署名工具需要输入密码明文,不能直接将build-profile.json5中的值用到署名工具中。
常见场景

  • 密码输入错误。
  • 命令行中需要输入明文密码,误输入了密文。
  • 密钥(keyAlias)密码和密钥库(p12)密码记混。
办理措施
出现该题目的原因是署名文件中署名密码错误。

开辟者可通过重新自动署名办理该题目:

  • 点击File > Project Structure > Project > Signing Configs,打开署名配置页面。
  • 勾选“Automatically generate signing”(假如是HarmonyOS工程,需同时勾选“Support HarmonyOS”),等待重新署名,然后点击OK即可。

编译报错“please check deviceType or distroFilter of the module”

题目现象
DevEco Studio编译时出现错误,出现如下提示之一:


  • Module: (xxx) and Module: (xxx) are entry, please check deviceType or distroFilter of the module.

  • Module: (xxx) and Module: (xxx) have the same moduleName, please check deviceType or distroFilter of the module.

  • Module: (xxx) and Module: (xxx) have the same packageName, please check deviceType or distroFilter of the module.

  • Module: (xxx) and Module: (xxx) have the same ability name.

办理措施
出现该题目的原因是打包时工程未满意HAP唯一性校验逻辑,请根据[HAP唯一性校验逻辑]修改工程,满意校验逻辑即可正常打包。
编译报错“Failed to generate test project build system”

题目现象
执行多模块native模块构建时,提示“Failed to generate test project build system.”错误信息。

办理措施
请删除报错模块下的.cxx文件夹,然后选中需要构建的模块,执行Make Module ${moduleName} 完成单独构建,避免同时构建多个模块。

C/C++项目三方依赖库未打包入HAP

题目现象
C/C++项目依赖三方so时,在打包生成HAP后,发现三方so未打包到HAP中。
办理措施
当前DevEco Studio对C/C++项目三方so的寻址方式有限,如出现三方so未打包到HAP中,请尝试修改so引入方式。

  • 界说一个别名(如jsbind_shared_lib_tracing),代表将要引入的三方so。
  • 利用SHARED IMPORT将三方so界说为动态引入。
  • 利用IMPORTED_LOCATION界说引入so的具体位置。
  • 将界说的三方so声明给目的。

  • 再次打包生成HAP,确认三方so是否打包到HAP中。
Static Library模块中src/main/cpp目录下的文件未打包进HAR

题目现象
点击Build > Make Module ${libraryName} 编译构建生成HAR后,发现构建产物中未出现cpp目录下的文件。

办理措施
假如利用的Hvigor为2.5.0-s及以上版本,在编译构建HAR的过程中,只会将dependencies内处于本模块路径下的当地依赖也打包进.har文件中,devDependencies里的依赖不会打包进.har文件中。
请将相应的当地依赖移至dependencies中后重新编译。

工程编译告警提示“ArkTS:WARN: For details about ArkTS syntax errors”

题目现象
工程构建时,提示“ArkTS:WARN: For details about ArkTS syntax errors, see FAQs”。

办理措施
出现该告警说明当前工程存在不符合ArkTS语法规范的写法,请根据ERROR报错中括号内的语法规则如(arkts-no-var),查看[从TypeScript到ArkTS的适配规则]中对应的说明,修改为ArkTS规范写法。
编译报错“ninja: error: mkdir(xxx): No such file or directory”

题目现象
Native工程编译报错,同时出现以下告警和报错信息。
出现工程目录长度凌驾250字符的告警,示例如下:

出现编译报错“ninja: error: mkdir(xxx): No such file or directory”,示例如下:

办理措施
CMAKE_OBJECT_PATH_MAX默认大小为250,假如工程中object file现实路径长度超出该大小,将导致编译报错。
开辟者需要根据object file现实路径长度在工程CMakeLists.txt中设置CMAKE_OBJECT_PATH_MAX大小,具体方法如下:


  • 方法一: 通常在CMAKE_OBJECT_PATH_MAX默认值底子上增长一个文件名长度即可。
    示例中告警文件为TextMeasureCache.cpp.obj,长度为24字符,在默认值250的底子上增长24,即设置set(CMAKE_OBJECT_PATH_MAX 274)
  • 方法二:根据object file现实路径长度计算CMAKE_OBJECT_PATH_MAX大小。
    计算公式:CMAKE_OBJECT_PATH_MAX = 总路径长度 - object file中目录部门长度 + cmake哈希值字符数(固定为32)

    • 总路径长度 = object file directory长度 + object file长度,object file directory、object file如下图所示,两个长度之和为297字符,以现实为准

    • object file中目录部门长度:示例中“////__/third-party/rn/ReactCommon/react/renderer/textlayoutmanager”长度为74字符,以现实为准
    • cmake哈希值字符数:cmake将长路径转换为哈希值时哈希值的长度,固定为32
    代入示例中的长度后,计算可得:CMAKE_OBJECT_PATH_MAX = 297 - 74 + 32 = 255,即设置set(CMAKE_OBJECT_PATH_MAX 255)

编译报错“(is the command line too long?)”

题目现象
Native工程编译报错,同时出现以下告警和报错信息。
出现工程目录长度凌驾250字符的告警,示例如下:

出现编译报错“(is the command line too long?)”,示例如下:

办理措施
CMAKE_OBJECT_PATH_MAX默认大小为250,假如工程中object file现实路径长度超出该大小,将导致编译报错。
开辟者需要根据object file现实路径长度在工程CMakeLists.txt中设置CMAKE_OBJECT_PATH_MAX大小,具体方法如下:


  • 方法一: 通常在CMAKE_OBJECT_PATH_MAX默认值底子上增长一个文件名长度即可。
    示例中告警文件为TextMeasureCache.cpp.obj,长度为24字符,在默认值250的底子上增长24,即设置set(CMAKE_OBJECT_PATH_MAX 274)
  • 方法二:根据object file现实路径长度计算CMAKE_OBJECT_PATH_MAX大小。
    计算公式:CMAKE_OBJECT_PATH_MAX = 总路径长度 - object file中目录部门长度 + cmake哈希值字符数(固定为32)

    • 总路径长度 = object file directory长度 + object file长度,object file directory、object file如下图所示,两个长度之和为297字符,以现实为准

    • object file中目录部门长度:示例中“////__/third-party/rn/ReactCommon/react/renderer/textlayoutmanager”长度为74字符,以现实为准
    • cmake哈希值字符数:cmake将长路径转换为哈希值时哈希值的长度,固定为32
    代入示例中的长度后,计算可得:CMAKE_OBJECT_PATH_MAX = 297 - 74 + 32 = 255,即设置set(CMAKE_OBJECT_PATH_MAX 255)

  • 方法三:若设置CMAKE_OBJECT_PATH_MAX后,仍然报相同错误,需要修改工程存放目录,将其存放在较短的目录下。
    设置CMAKE_OBJECT_PATH_MAX后,cmake会将长路径转换为32字符的哈希值以收缩路径长度,假如转换后的路径依然过长,只能收缩工程的存放路径。
编译报错“CMake Error: The following variables are used in this project, but they are set to NOTFOUND”

题目现象
Native工程中利用find_path时出现以下报错信息。

办理措施
OpenHarmony SDK提供的CMake交叉编译配置文件(ohos.toolchain.cmake)中,限制了搜索路径为CMAKE_SYSROOT。
假如开辟者需要添加搜索路径,可在CMakeList.txt中利用list接口添加自界说路径,如将"D:demo"添加至搜索路径:
  1. list(APPEND CMAKE_FIND_ROOT_PATH_MODE_INCLUDE "D:demo")
复制代码
添加后,即可利用find_path查找"D:demo"目录下的文件。
编译报错 “Unknown resource name”



  • 场景一
题目现象
工程中模块A引用了模块B,编译模块A时出现错误,提示 “Unknown resource name ‘xxxx’”,找不到模块B的资源。

办理措施
请确保符合以下条件:

  • 资源需放置在目录resource/base路径下。
  • 模块B已安装。
  • 模块A中不能利用相对路径引用模块B的资源,应直接通过界说的模块名称来引用。


  • 场景二
题目现象
引用模块的方式不对,假如引用的是一个其他模块的代码,也会报资源找不到。


办理措施
在oh_package.json5中引入该模块。通过界说的模块名称来引用。
如下图所示:



  • 场景三
题目现象
HSP A 申请了某个权限,这个权限举行了资源的引用,在所有依赖A的组件举行构建时,报错 A 引用的资源找不到。
办理措施
手动在引用方配置对应资源可以办理此题目。
构建报错“ERROR: Task xxx was not found in the project xxx”

题目现象
命令行手动执行构建命令时,构建失败,提示“ERROR: Task xxx was not found in the project xxx.”
题目确认

  • 执行hvigorw tasks命令,查看对应命令是否存在。
  • 查看对应工程中module.json5文件中“type”字段是否为命令执行模块。比如图中执行assembleHar命令,是对工程中的har模块举行打包,若module.json5文件中的“type”字段不是"har"范例,则会出现上述错误提示。
办理措施

  • 执行正确命令。
  • 查看对应工程中module.json5文件中“type”字段范例,执行对应命令。
编译报错“The reason and usedScene attributes are mandatory for user_grant permissions”

题目现象
DevEco Studio编译失败,提示“The reason and usedScene attributes are mandatory for user_grant permissions”。

题目原因
从DevEco Studio NEXT Developer Preview2版本开始新增规则:APP包中,所有entry和feature hap的module下的requestPermissions权限清单必须指定(可以缺省为空,若非空则name必填,user_grant权限则必填reason、usedScene字段)。
办理措施
进入对应module.json5文件中,补齐requestPermissions字段下的reason和usedScene字段。如以下示例:
  1. "requestPermissions": [
  2.   {
  3.     "name": "ohos.permission.READ_IMAGEVIDEO",
  4.     "reason": "$string:module_desc",
  5.     "usedScene": {
  6.       "abilities": [
  7.         "EntryAbility"
  8.       ],
  9.       "when": "inuse"
  10.     }
  11.   }
  12. ]
复制代码
编译报错“Only one default card can be configured in the form_config.json file”

题目现象
DevEco Studio编译失败,提示“Only one default card can be configured in the form_config.json file”。

题目原因
从DevEco Studio NEXT Developer Preview2版本开始新增规则:卡片的配置文件中isDefault不可缺省,每个UIAbility有且只有一个默认卡片。
办理措施
进入对应module.json5文件中,选择唯一默认卡片,将其他卡片的isDefault字段设置为false。
编译报错“In the form_config.json file, if the value of the updateEnabled field is true, the updateDuration and scheduleUpdateTime fields cannot be both empty”

题目现象
DevEco Studio编译失败,提示“In the form_config.json file, if the value of the updateEnabled field is true, the updateDuration and scheduleUpdateTime fields cannot be both empty.”。

题目原因
从DevEco Studio NEXT Developer Preview2版本开始新增规则:卡片的配置文件中updateEnabled不可缺省,为true时可以在定时刷新(updateDuration)和定点刷新(scheduledUpdateTime)两种方式任选其一,当两者同时配置时,定时刷新优老师效。
办理措施
进入对应module.json5文件中,按照需求,选择配置updateEnabled为false,大概增长定时刷新(updateDuration)和定点刷新(scheduledUpdateTime)两种方式配置。
编译报错“The path XX is not writable. please choose a new location”

题目现象
在mac上,通过直接打开dmg中的IDE图标打开DevEco Studio,构建报错 The path XX is not writable. please choose a new location.”。

题目原因
在mac上直接打开dmg 中IDE图标进入DevEco Studio,是会以只读的方式打开的,内置到DevEco Studio内里的文件是没有写权限的。
办理措施
将“DevEco-Studio.app”拖拽到“Applications”中,先安装在利用。
编译报错“Property ‘XX’ does not exist on type ‘typeof BuildProfile’”

题目现象
当地HSP模块对外提供的接口中利用了HAP未界说的自界说参数BuildProfileFileds,且HAP引用了HSP中的该接口,导致编译失败,提示“Property ‘XX’ does not exist on type ‘typeof BuildProfile’”。
外链图片转存失败,源站大概有防盗链机制,建议将图片保存下来直接上传
办理措施
可接纳以下两种方式办理该题目:


  • 在HAP中配置与HSP相同的自界说参数BuildProfileFileds。
  • 将与HSP相同的自界说参数BuildProfileFileds配置到工程级build-profile.json5中,该方法会使HSP中的自界说参数在全局生效。
编译报错“The useNormalizedOHMUrl settings of packages xxx and the project useNormalizedOHMUrl: xxx do not match”

题目现象
编译报错“The useNormalizedOHMUrl settings of packages xxx and the project useNormalizedOHMUrl: xxx do not match”。
办理措施
[useNormalizedOHMUrl] 为true的时间ohmurl利用的是新的拼接和解析方式,不能和旧的ohmurl混用,会导致运行时无法辨认。
可接纳以下两种方式办理该题目:


  • 将报错的依赖包的工程级build-profile.json5中的useNormalizedOHMUrl修改为与当前工程一致,重新生成依赖包并替换(useNormalizedOHMUrl缺省默认值为false)。

  1. {
  2.   "app": {
  3.     "products": [
  4.       {
  5.          "buildOption": {
  6.            "strictMode": {
  7.              "useNormalizedOHMUrl": true
  8.            }
  9.          }
  10.       }
  11.     ]
  12.   }
  13. }
复制代码


  • 假如与工程不一致的依赖包较多,建议修改工程的工程级build-profile.json5中的useNormalizedOHMUrl值以及替换其它的不一致的依赖包。
假如修改了useNormalizedOHMUrl仍无法办理,表明当前hsp包是当地包,需要以当地hsp包的形式引入,请在工程下的build-profile.json5中的modules中添加报错hsp模块,示例如下:
  1. "modules": [
  2.   {
  3.     name: "hsp",   // 引用的hsp包依赖
  4.     srcPath: "../MyApplication_stageB/hsp",   // 引用的hsp包的路径(绝对和相对都可以)
  5.   }
  6. ]
复制代码
如何配置oh-package.json5动态依赖

oh-package.json5文件中:


  • dependencies(生产依赖):声明需要在代码中import的三方库(参与编译/运行阶段利用的依赖)。
  • devDependencies(开辟依赖):参与项目的开辟或测试阶段。
  • dynamicDependencies(动态依赖):动态依赖的HSP模块。在开辟者需要动态加载HSP的时间配置利用。
  1. {
  2.   "name": "parameter-test",
  3.   "version": "@param:version",
  4.   "description": "test desc.",
  5.   "main": "index.ets",
  6.   "author": "test author",
  7.   "license": "ISC",
  8.   "dependencies": {
  9.     "libtest1": "@param:dependencies.libtest1"
  10.   },
  11.   "devDependencies": {
  12.     "libtest2": "@param:devDependencies.libtest2"
  13.   },
  14.   "dynamicDependencies": {
  15.     "libtest3": "@param:dynamicDependencies.libtest3"
  16.   },
  17.   "parameterFile": '.parameterFile/parameterFile.json5' // 开启参数化并指定参数化配置文件路径
  18. }
复制代码
如何办理SDK与镜像不匹配导致abc文件无法正常运行的题目

题目现象
当SDK版本与镜像版本不匹配时,应用将会闪退,出现jscrash,同时hilog出现日志。
办理措施
现象根本原因是SDK工具与镜像版本不匹配。推荐利用匹配的SDK与镜像版本。
查看SDK版本方法:
在DevEco Studio安装路径下的sdk路径中,执行 {sdk.dir}/openharmony/ets/build-tools/ets-loader/bin/ark/build-win/bin/es2abc.exe --bc-version可查看SDK版本号。用于检验SDK与镜像版本是否匹配。
如何办理编译报错“Could not resolve ‘xxx’ from”,但’xxx’目录存在的题目

题目现象
编译报错:“Could not resolve ‘xxx’ from”,但’xxx’目录存在,目录下存在Index文件。
题目原因
在引用目录时,编译时自动拼接小写的index文件,而目录中是大写的Index文件,在编译大小写敏感时,找不到index文件,则报错。
办理措施
在引用’xxx’目录时,明确写明引用到’xxx/Index’文件。
用户目录下没有npmrc文件

题目现象
新建项目报错 Error: The hvigor depends on the npmrc file. Configure the npmrc file first。
题目原因
在用户目录下没有 .npmrc 文件。
办理措施
在用户目录下创建.npmrc文件,配置如下信息:
  1. registry=https://repo.huaweicloud.com/repository/npm/
  2. @ohos:registry=https://repo.harmonyos.com/npm/
复制代码
如何办理编译报错“ Error: ‘icon’ value $media:icons invalid value.”的题目

题目现象
编译报错“ Error: ‘icon’ value $media:icons invalid value”。
  1. ERROR: Failed :entry:default@CompileResource...
  2. ERROR: Tools execution failed.
  3. Error: ref `$media:icons` don`t be defined.
  4. Error: 'icon' value `$media:icons` invalid value.
  5. at D:\project\process_profile\default\module.json
  6. Detail: Please check the message from tools.
复制代码
报错原因
引用的资源不存在时,编译报错指向的文件路径是build目录。
常见场景

  • 资源文件未添加。
  • 资源文件被意外删除。
办理方案
根据报错的资源id全局搜索,查看报错的资源是否存在。
如何办理编译报错“Error: cJSON_Parse failed, please check the JSON file.”的题目

题目现象
编译报错“Error: cJSON_Parse failed, please check the JSON file”。
图1

报错原因
module.json文件格式不正确。
常见场景

  • json文件内末尾多了逗号。
  • 根标签不是大括号{}。
办理方案
查抄报错指向的json文件格式,比如是否末尾多了逗号,根标签是否为大括号{}。
如何办理编译报错“Error: ‘XXX’ only contain [a-zA-z0-9_].”的题目

题目现象
编译报错“Error: ‘XXX’ only contain [a-zA-z0-9_]”。
图2

办理方案
查抄文件名是否合法,文件名只能包罗大小写字母、数字、下划线。
如何办理三方包require语句报错

题目现象
当引入三方包时编译报错。
报错原因
部门三方包由npm迁徙而来,其开辟环境为node, 此中的require语法arkcompiler不完全支持,出现运行报错情况。
场景1
  1. // Module/src/test.json
  2. {a: 1, b: 2}
  3. //use.js
  4. let test = require("Module/src/test.json")
复制代码
需修改为:
  1. // Module/src/test.js
  2. module.exports = {a: 1, b: 2}
  3. //use.js
  4. let test = require("Module/src/test")
复制代码
场景2:
  1. // Module/package.json
  2. ...
  3. main: "./src"
  4. ...
  5. // use.js
  6. let module = require("Module")
复制代码
需修改为:
  1. // Module/package.json
  2. ...
  3. main: "./src/index.js"
  4. ...
  5. // use.js
  6. let module = require("Module")
复制代码
场景3:
编译出现warning信息:
  1. Plugin node-resolve: preferring built-in module 'util' over local alternative at '/Users/~/Documents/fe-module/demo/node_modules/util/util.js', pass 'preferBuiltins: false' to disable this behavior or 'preferBuiltins: true' to disable this warning
复制代码
办理方案
修改rollup 配置文件,rollup.config.js中修改 preferBuiltins 字段:
  1. plugins: [
  2.   resolve({
  3.     preferBuiltins: false,    // true 或 false
  4.     mainFields: ['module', 'main'],
  5.     extensions
  6.   })
  7. ];
复制代码
场景4:
  1. import {Buffer} from 'buffer'
复制代码
需修改为:
  1. import {Buffer} from 'buffer/'
复制代码
如何办理编译报错“Indexed access is not supported for fields(arkts-no-props-by-index)”的题目

题目现象
动态调用类大概接口的字段,导致编译报错出现:Indexed access is not supported for fields(arkts-no-props-by-index)。

办理方案
修改代码:
  1. getValue(breakpoint: string): T {
  2.     return Reflect.get(this.options, breakpoint) as T;
  3. }
复制代码
如何办理编译报错“Declaration merging is not supported(arkts-no-decl-merging)” 或 “Cannot redeclare block-scoped variable ‘xxx’”的题目

题目现象
在不同的文件中声明相同变量大概interface、enum等范例,DevEco Studio不报错,但是编译报错。

办理方案
假如文件中不包罗export关键字,该文件将视作全局定名空间的一部门,相当于两个文件实质为同一个文件。请添加export关键字使其成为独立定名空间,大概将声明的内容添加到自界说的定名空间中。
如何办理编译报错“ The inferred type of ‘xxx’ cannot be named without a reference to ‘xxx’. This is likely not portable. A type annotation is necessary . ”的题目

题目现象
编译报错"The inferred type of ‘xxx’ cannot be named without a reference to ‘xxx’. This is likely not portable. A type annotation is necessary"。
题目原因
HSP会生成.d.ts声明文件,由于原始文件中未注明范例,导致生成的.d.ts文件缺少范例注解。

办理方案
报错位置添加范例注解。
如何办理编译报错"arkts-no-any-unknown" 和 "Cannot find module ‘xx’ or its corresponding type declarations"的题目

题目现象
编译报错"arkts-no-any-unknown" 和 “Cannot find module ‘xx’ or its corresponding type declarations”。
题目 原因
大小写敏感导致模块找不到。常见于图片中的两种错误同时出现,且仅在Linux系统出现,win/mac不报错。

办理方案
办理引用中的大小写题目。
如何办理编译报错“ERROR: ArkTS Compiler Error ERROR: /bin/sh: “xxxx/es2abc”: Operation not permitted”的题目

题目现象
编译报错“ERROR: ArkTS Compiler Error ERROR: /bin/sh: “xxxx/es2abc”: Operation not permitted”。
题目原因
由于获取SDK的方式是从网络上下载,mac的安全设置会给可执行文件添加来源于网络的标识(com.apple.quarantine),导致无法执行。
办理方案
执行命令删除可执行文件的com.apple.quarantine标识。
  1. xattr -d com.apple.quarantine /path/to/es2abc
复制代码
如何办理编译报错“Cannot add xxxx items to index”的题目

题目现象
编译报错“Cannot add xxxx items to index”。
题目原因
被编译文件中某函数内部有大量object literal, array iteral和string,导致item的数量凌驾了上限(65536)。
办理方案
排查相关文件,将存在上述原因的函数举行拆分。
编译初始化报错“resource busy or locked, open ‘xxx\outputs\build-logs\build.log’”

题目现象
在升级DevEco Studio至5.0.3.403版本后,打开旧工程概率性报错:resource busy or locked, open ‘xxx\outputs\build-logs\build.log’。

题目原因
初始化时日志写入存在冲突,.hvigor目录中的build-log文件被占用导致了该报错。
办理方案


  • 方法一:点击编辑器窗口上方的Sync Now。

  • 方法二:点击工具栏File > Sync and Refresh Project

  • 方法三:假如方法1、2无法办理题目,可以手动删除工程目录下的.hvigor目录后重启执行Sync。

Mac环境下加载动态库,署名拦截导致未生效

题目现象
Mac环境下,在DevEco项目开辟时,build-profile.json中添加了如下的插桩配置,但是插桩功能未生效。
  1. "transformLib": "<相对模块根路径的动态库路径,以./开头>"
复制代码
判断与验证

  • 进入sdk中es2abc地点目录:[DevEco-Studio安装目录]/Contents/sdk/default/openharmony/ets/build-tools/ets-loader/bin/ark/build-mac/bin。
  • 执行下列命令:
    1. ./es2abc --merge-abc --transform-lib <动态库路径> <测试js文件路径>
    复制代码
  • 假如提示类似如下报错信息,原因大概是es2abc和动态库文件不属于一个署名组。
  1. os::library_loader::Load error: dlopen(..., 0x0001):
  2. tried: '...' (code signature in <...> '...' not valid for use in process: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.)
复制代码

  • 用下面命令查看es2abc和动态库文件的署名组信息,假如两个文件,一个有署名信息,一个没有署名信息,大概都有署名信息,但是署名信息中属性’TeamIdentifier’的值是不一样的,那就说明题目是署名组不一致导致的,可以利用"办理方案"提供的方式处置惩罚。
  1. codesign -dv --verbose=1 <es2abc路径>
  2. codesign -dv --verbose=1 <动态库路径>
复制代码
办理方案
执行下列命令,将es2abc文件的署名替换成和动态库文件一样的用户署名。
  1. codesign --remove-signature <es2abc路径>
  2. codesign -s - -v <es2abc路径>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

三尺非寒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表