如何解决编译过程内存过高

问题现象

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

解决措施

  • 在并行模式下执行hvigor构建,默认会有5个worker线程同时执行编译,且在编译的过程中,会在内存中添加一些缓存对象,用于提高后续增量编译的效率。

    可以在hvigor-config.json5中添加配置。

"properties": {
  // 配置为0,表示不启用内存缓存配置,默认为4,数值越低,内存中缓存数据越少
  "hvigor.pool.cache.capacity": 0,
  // 默认配置为cpu核数-1, 包含ohos.arkCompile.maxSize4,值越小,占用内存越少
  "hvigor.pool.maxSize" : 5,
  // 默认配置值为5, 值越小,占用内存越少
  "ohos.arkCompile.maxSize": 3,
  // 默认配置值为true, 表示开启内存缓存,占用内存较多,配置为false,关闭内存缓存,占用内存较少
  "hvigor.enableMemoryCache": false
},

说明

当配置项"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,示例:

      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文件中配置如下内容:

"debugging": {
  "stacktrace": true                /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */
},

如果上述文件中并未排查出问题,请及时向我们提单反馈。

请按照如下步骤进行操作:[提单链接],在线提单->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()。

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失败,从而签名失败。

场景

  1. 使用DevEco Studio生产密钥对时,DevEco Studio默认会调用软件内预置的JDK17,而用户使用本地的低版本JDK进行签名时则会报错。
  2. 用户本地使用高版本JDK生成密钥对时,又通过DevEco Studio进行签名,DevEco Studio中预置的JDK17版本低于用户的JDK,导致报错。

解决方案

请检查当前使用的JDK版本和生产密钥对使用的JDK版本,使用版本匹配的JDK执行签名命令。

编译报错“generate SignerBlock failed”

问题现象

编译构建时,出现错误:message:generate SignerBlock failed。

hap-sign-tool: error: {errorcode:0,message:generate SignerBlock failed}

错误原因

签名用的公私钥对不匹配,使用私钥签名后,用公钥验签失败。需保证私钥(keyalias)和公钥(appCertPath)配对使用。

场景

  1. 本地生产签名材料时,未导出正确的keyalias对应的csr(证书请求文件),导致生成证书时,公钥与keyalias对应的私钥不匹配。
  2. 签名过程参数填写错误,使用了错误的keyalias或者appCertPath文件。

解决方案

请选择正确、配对的keyalias和appCertPath文件。

编译报错“java.io.IOException: DerValue.getOID, not an OID 49”

问题现象

编译构建时,出现错误:java.io.IOException: DerValue.getOID, not an OID 49。

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。

场景

  1. 证书被篡改。
  2. 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):

"nodeOptions": {
  "maxOldSpaceSize": 8192
}

Linux环境下编译报错“JS heap out of memory”

问题现象

在Linux环境下,系统内存有64G,Hvigorw脚本中配置–max-old-space-size=40960,在编译构建时,实际在使用内存未达到配置的内存(例如使用到20G左右)就出现报错“JS heap out of memory“。

FATAL ERROR: NewSpace::Rebalance Allocation failed - JavaScript heap out of memory
Writing Node.js report to file: report.20200512.172528.47517.24.011.json
Node.js report completed
1: 0xa295e0 node::Abort() [node]
2: 0x9782df node::FatalError(char const*, char const*) [node]
3: 0xb99c2e v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [node]
4: 0xb99fa7 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [node]
5: 0xd3a3b5 [node]
6: 0xd74f27 [node]
7: 0xd84707 v8::internal::MarkCompactCollector::CollectGarbage() [node]
8: 0xd481b9 v8::internal::Heap::MarkCompact() [node]
9: 0xd48f0b v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [node]
10: 0xd499a5 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node]
11: 0xd4aebf v8::internal::Heap::HandleGCRequest() [node]
12: 0xcf5f97 v8::internal::StackGuard::HandleInterrupts() [node]
13: 0x104b803 v8::internal::Runtime_StackGuard(int, unsigned long*, v8::internal::Isolate*) [node]
14: 0x13a5a99 [node]
Aborted (core dumped)

问题原因

vm.max_map_count是一个与内核虚拟内存子系统相关的参数,用于控制进程可以拥有的内存映射区域的最大数量。它通常用于限制一个进程可以打开的文件数量,特别是在使用大量内存映射文件的情况下。

在Linux系统上,vm.max_map_count参数的默认值通常是较小的数值,例如65530。然而,对于一些需要大量内存映射的应用程序或者特定的使用场景,可能需要增加该参数的值,以便支持更多的内存映射区域。

解决措施

修改vm.max_map_count的值:

  • 临时修改:

    sysctl -w vm.max_map_count=新值
    
  • 永久修改:如果希望永久修改参数的值,可以编辑/etc/sysctl.conf文件,并添加或修改以下行:

    vm.max_map_count=新值
    

    保存文件后,使用以下命令使更改生效:

    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)的现有工程在编译构建阶段,语法校验工具便会报错提示找不到对应的声明文件。

    如果出现类似问题,可尝试通过如下方式进行解决:

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

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    2. 在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 中这样引入:

    "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声明文件:

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

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    1. 在引用类型文件中通过添加type显式声明符号类型引用:

      export type {T} from './type';
      

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    1. 同时排查是否从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符号 。

    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”。

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    问题确认

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

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    2. 进入包下的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’”。

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    问题确认

    1. 排查yyy所在模块是否为字节码har,查看工程级build-profile.json5的useNormalizedOHMUrl是否为true(缺省默认值为false),如果为true则默认构建字节码har。
    2. 如果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。

"buildOption": { 
  "arkOptions": { 
    "byteCodeHar": false
  }
}
  • 场景六:

    请确认当前使用的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值保持相同。

以下为导致编译报错的错误配置示例:

"targets": [
  {
    "name": "default",
    "config": {
      "buildOption": {
        "arkOptions": {
          "buildProfileFields": {
            "targetName": "default"
          }
        }
      }
    }
  },
  {
    "name": "default1",
    "config": {
      "buildOption": {
        "arkOptions": {
          "buildProfileFields": {
            "targetName1": "default1"
          }
        }
      }
    }
  },
]

请将targets内所有buildProfileFields中的key值修改一致,如以下示例:

"targets": [
  {
    "name": "default",
    "config": {
      "buildOption": {
        "arkOptions": {
          "buildProfileFields": {
            "targetName": "default"
          }
        }
      }
    }
  },
  {
    "name": "default1",
    "config": {
      "buildOption": {
        "arkOptions": {
          "buildProfileFields": {
            "targetName": "default1"
          }
        }
      }
    }
  },
]

问题现象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。

"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"错误通常表示链接器找不到特定符号的定义。这通常是因为源文件没有正确编译或链接,或者因为缺少必要的库文件。以下是如何定位和解决这个问题的步骤:

  1. 确保所有源文件都已包含在 CMake 构建中。

首先,检查您的 CMakeLists.txt 文件,确保所有相关的源文件都已包含在项目中。

示例 CMakeLists.txt

cmake_minimum_required(VERSION 3.10) 
project(MyProject)  
set(CMAKE_CXX_STANDARD 17)  
include_directories(${CMAKE_CURRENT_SOURCE_DIR}                    
                    ${CMAKE_CURRENT_SOURCE_DIR}/include)  
# 添加所有源文件
add_library(myProgram SAHRED main.cpp myLibrary.cpp) 
  1. 确认源文件的符号定义。

确保在所有相关的源文件中正确定义了符号。例如,检查 myLibrary.cpp 是否包含 myFunction 的定义:

myLibrary.cpp

#include "myLibrary.h" 
void myFunction() {     
// Function implementation
}

myLibrary.h

#ifndef MY_LIBRARY_H
#define MY_LIBRARY_H 
void myFunction();  
#endif 
  1. 检查编译和链接顺序。

确保所有源文件和库文件按照正确的顺序进行编译和链接。CMake 和 Ninja 通常会处理这个问题,但在手动编译时可能会出现问题。

  1. 清理和重新生成构建文件。

有时,构建文件可能会损坏或丢失符号定义。尝试清理构建目录并重新生成构建文件:

hvigorw clean 1 

或手动删除模块下.cxx目录。

  1. 检查库路径和链接器标志。

如果使用三方库,确保 CMakeLists.txt 中正确配置了库路径和链接器标志。例如:

cmake_minimum_required(VERSION 3.10) 
project(MyProject)  
set(CMAKE_CXX_STANDARD 17)  
# 确保添加三方库的头文件
include_directories(${PATH_TO_EXTERNAL_LIBRARY}
                    ${PATH_TO_EXTERNAL_LIBRARY}/include)  
# 添加源文件
add_library(myProgram SAHRED main.cpp myLibrary.cpp)  
# 链接三方库
target_link_libraries(myProgram PUBLIC /path/to/external/library) 
  1. 启用详细编译和链接输出。

为了解详细的编译和链接过程,可以启用更详细的输出。在 CMakeLists.txt 中添加以下内容:

set(CMAKE_VERBOSE_MAKEFILE ON)
  1. 检查 Ninja 输出日志。

Ninja 默认生成 .ninja_log 文件,其中包含构建过程的详细信息。您可以检查这个日志文件以了解构建过程中的问题。

cat {module}/.cxx/default/default/arm64-v8a/.ninja_log 

检查编译日志中是否存在符号所在的源文件或头文件。

  1. 使用 nm 工具检查符号。

使用 nm 工具检查目标文件和库文件中的符号,确保符号定义存在。

可使用sdk中内置的nm工具:sdk/default/openharmony/native/llvm/bin/llvm-nm。

检查目标文件

nm myLibrary.o | grep myFunction 

检查三方库文件

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
#include "myLibrary.h" 
int main() {
     MyType obj;
     // 使用自定义类型
     return 0;
}

// myLibrary.h
#ifndef MY_LIBRARY_H
#define MY_LIBRARY_H
class MyType {
public:
     MyType() {}
     void doSomething();
};
#endif
  1. 检查头文件路径。

确保 CMakeLists.txt 中正确设置了头文件的搜索路径。可以通过 include_directories 添加头文件目录。

示例 CMakeLists.txt:

cmake_minimum_required(VERSION 3.10) 
project(MyProject)  
set(CMAKE_CXX_STANDARD 17)  
# 添加头文件目录
include_directories(${CMAKE_SOURCE_DIR}/include)  
# 添加源文件
add_library(myProgram SHARED src/main.cpp src/myLibrary.cpp) 
  1. 清理和重新生成构建文件。

有时,构建文件可能会损坏或丢失符号定义。尝试清理构建目录并重新生成构建文件:

hvigorw clean

或手动删除模块下.cxx目录。

  1. 启用详细编译输出。

为了解详细的编译过程,可以启用更详细的输出。在 CMakeLists.txt 中添加以下内容:

set(CMAKE_VERBOSE_MAKEFILE ON) 
  1. 检查编译输出日志。

Ninja 默认生成 .ninja_log 文件,其中包含构建过程的详细信息。你可以检查这个日志文件以了解构建过程中的问题。

cat .cxx/default/default/arm64-v8a/.ninja_log
  1. 使用 CMake 的 message 函数调试。

可以在 CMakeLists.txt 文件中添加 message 函数来打印一些调试信息,以确保路径和变量正确设置。

示例:

message(STATUS "Source directory: ${CMAKE_SOURCE_DIR}") 
message(STATUS "Include directories: ${CMAKE_INCLUDE_PATH}") 

结论

通过上述步骤,您可以定位和解决 unknown type name 问题。在使用 CMake、Ninja 和 LLVM 编译 C++ 项目时,确保所有头文件正确包含并设置正确的头文件路径是关键。如果问题依旧存在,详细的编译输出日志通常能提供更多线索,帮助您找到具体的原因。

JDK版本不匹配导致编译失败

问题现象

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

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解决措施

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

  1. 下载并安装JDK 17版本。
  2. 修改JAVA_HOME环境变量,取值修改为JDK 17。

LABEL_VALUE_ERROR处理指导

问题现象

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

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解决措施

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

  1. resources > base > element中的string.json中添加对应的字符串信息。

  2. 然后在config.json中重新引用该字符串资源。

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

问题现象

在工程同步或者编译构建时出现错误,提示“Schema validate failed”。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解决措施

在开发应用/服务时,可以设置应用/服务的启动界面的图标及背景颜色,创建工程后自动设置了默认的启动界面信息,但若开发者误删其中某个字段后将导致报错。下面以重新设置启动界面信息为例,开发者可自定义启动界面的图标及背景颜色。

在开发应用/服务时,为了提升应用/服务冷启动的性能,您可以通过如下方式设置应用/服务的启动界面的图标及背景颜色。

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

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  2. 在弹出的对话框中,“File name”开发者可自定义,如color;“Root element”请选择color。

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

在这里插入图片描述

  1. 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”,报错信息如下:

     Detail: Please check the following fields.
{
  instancePath: 'module.abilities[0]',
  keyword: 'required',
  params: { missingProperty: 'name' },
  message: "must have required property 'name'",
  location: 'D:/MyApplication/entry/src/main/module.json5:15:8'
} 
{
  instancePath: 'module.abilities[0]',
  keyword: 'required',
  params: { missingProperty: 'srcEntrance' },
  message: "must have required property 'srcEntrance'",
  location: 'D:/MyApplication/entry/src/main/module.json5:15:8'
} 
{
  instancePath: 'module.abilities[0]',
  keyword: 'required',
  params: { missingProperty: 'name' },
  message: "must have required property 'name'",
  location: 'D:/MyApplication/entry/src/main/module.json5:15:8'
} 
{
  instancePath: 'module.abilities[0]',
  keyword: 'oneOf',
  params: { passingSchemas: null },
  message: 'must match exactly one schema in oneOf',
  location: 'D:/MyApplication/entry/src/main/module.json5:15:8'
} 
{
  instancePath: 'module.abilities[0]',
  keyword: 'enum',
  params: {
    allowedValues: [
      'priority',
      'name',
      'srcEntrance',
      'srcEntry',
      'launchType',
      'description',
      'icon',
      'label',
      'permissions',
      'metadata',
      'visible',
      'exported',
      'skills',
      'backgroundModes',
      'continuable',
      'startWindowIcon',
      'startWindowBackground',
      'removeMissionAfterTerminate',
      'orientation',
      'supportWindowMode',
      'maxWindowRatio',
      'minWindowRatio',
      'maxWindowWidth',
      'minWindowWidth',
      'maxWindowHeight',
      'minWindowHeight',
      'excludeFromMissions'
    ]
  },
  message: 'must be equal to one of the allowed values',
  location: 'D:/MyApplication/entry/src/main/module.json5:15:8'
} 
{
  instancePath: 'module.abilities[0]',
  keyword: 'propertyNames',
  params: { propertyName: 'nam' },
  message: 'property name must be valid',
  location: 'D:/MyApplication/entry/src/main/module.json5:15:8'
} 

以上述报错为例,说明报错中关键词的含义,便于开发者理解报错信息,完成问题定位及修改。

  • 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模块是否存在,出现该问题的原因可能为以下情况:

  1. 在feature模块的build-profile.json5文件中,entryModules字段配置的名称与实际entry模块的名称不一致。请将entryModules字段的值修改为entry模块的名称;
  2. 在项目级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中的值用到签名工具中。

常见场景

  1. 密码输入错误。
  2. 命令行中需要输入明文密码,误输入了密文。
  3. 密钥(keyAlias)密码和密钥库(p12)密码记混。

解决措施

出现该问题的原因是签名文件中签名密码错误。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

开发者可通过重新自动签名解决该问题:

  1. 点击File > Project Structure > Project > Signing Configs,打开签名配置页面。

  2. 勾选“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引入方式。

  1. 定义一个别名(如jsbind_shared_lib_tracing),代表将要引入的三方so。

  2. 使用SHARED IMPORT将三方so定义为动态引入。

  3. 使用IMPORTED_LOCATION定义引入so的具体位置。

  4. 将定义的三方so声明给目标。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  5. 再次打包生成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"添加至搜索路径:

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的资源。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解决措施

请确保符合以下条件:

  1. 资源需放置在目录resource/base路径下。
  2. 模块B已安装。
  3. 模块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.”

问题确认

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

解决措施

  1. 执行正确命令。
  2. 查看对应工程中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字段。如以下示例:

"requestPermissions": [
  {
    "name": "ohos.permission.READ_IMAGEVIDEO",
    "reason": "$string:module_desc",
    "usedScene": {
      "abilities": [
        "EntryAbility"
      ],
      "when": "inuse"
    }
  }
]

编译报错“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)。
    在这里插入图片描述
{
  "app": {
    "products": [
      {
         "buildOption": {
           "strictMode": {
             "useNormalizedOHMUrl": true
           }
         }
      }
    ]
  }
}
  • 如果与工程不一致的依赖包较多,建议修改工程的工程级build-profile.json5中的useNormalizedOHMUrl值以及替换其它的不一致的依赖包。

如果修改了useNormalizedOHMUrl仍无法解决,表明当前hsp包是本地包,需要以本地hsp包的形式引入,请在工程下的build-profile.json5中的modules中添加报错hsp模块,示例如下:

"modules": [
  {
    name: "hsp",   // 引用的hsp包依赖
    srcPath: "../MyApplication_stageB/hsp",   // 引用的hsp包的路径(绝对和相对都可以)
  }
]

如何配置oh-package.json5动态依赖

oh-package.json5文件中:

  • dependencies(生产依赖):声明需要在代码中import的三方库(参与编译/运行阶段使用的依赖)。
  • devDependencies(开发依赖):参与项目的开发或测试阶段。
  • dynamicDependencies(动态依赖):动态依赖的HSP模块。在开发者需要动态加载HSP的时候配置使用。
{
  "name": "parameter-test",
  "version": "@param:version", 
  "description": "test desc.",
  "main": "index.ets",
  "author": "test author",
  "license": "ISC",
  "dependencies": {
    "libtest1": "@param:dependencies.libtest1"
  },
  "devDependencies": {
    "libtest2": "@param:devDependencies.libtest2"
  },
  "dynamicDependencies": {
    "libtest3": "@param:dynamicDependencies.libtest3"
  },
  "parameterFile": '.parameterFile/parameterFile.json5' // 开启参数化并指定参数化配置文件路径
}

如何解决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文件,配置如下信息:

registry=https://repo.huaweicloud.com/repository/npm/
@ohos:registry=https://repo.harmonyos.com/npm/

如何解决编译报错“ Error: ‘icon’ value $media:icons invalid value.”的问题

问题现象

编译报错“ Error: ‘icon’ value $media:icons invalid value”。

ERROR: Failed :entry:default@CompileResource...
ERROR: Tools execution failed.
Error: ref `$media:icons` don`t be defined.
Error: 'icon' value `$media:icons` invalid value.
at D:\project\process_profile\default\module.json
Detail: Please check the message from tools.

报错原因

引用的资源不存在时,编译报错指向的文件路径是build目录。

常见场景

  1. 资源文件未添加。
  2. 资源文件被意外删除。

解决方案

根据报错的资源id全局搜索,查看报错的资源是否存在。

如何解决编译报错“Error: cJSON_Parse failed, please check the JSON file.”的问题

问题现象

编译报错“Error: cJSON_Parse failed, please check the JSON file”。

图1
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

报错原因

module.json文件格式不正确。

常见场景

  1. json文件内末尾多了逗号。

  2. 根标签不是大括号{}。

解决方案

检查报错指向的json文件格式,比如是否末尾多了逗号,根标签是否为大括号{}。

如何解决编译报错“Error: ‘XXX’ only contain [a-zA-z0-9_].”的问题

问题现象

编译报错“Error: ‘XXX’ only contain [a-zA-z0-9_]”。

图2
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解决方案

检查文件名是否合法,文件名只能包含大小写字母、数字、下划线。

如何解决三方包require语句报错

问题现象

当引入三方包时编译报错。

报错原因

部分三方包由npm迁移而来,其开发环境为node, 其中的require语法arkcompiler不完全支持,出现运行报错情况。

场景1

// Module/src/test.json
{a: 1, b: 2}
//use.js
let test = require("Module/src/test.json")

需修改为:

// Module/src/test.js
module.exports = {a: 1, b: 2}
//use.js
let test = require("Module/src/test")

场景2:

// Module/package.json
...
main: "./src"
...
// use.js
let module = require("Module")

需修改为:

// Module/package.json
...
main: "./src/index.js"
...
// use.js
let module = require("Module")

场景3:

编译出现warning信息:

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 字段:

plugins: [ 
  resolve({ 
    preferBuiltins: false,    // true 或 false
    mainFields: ['module', 'main'], 
    extensions
  })
];

场景4:

import {Buffer} from 'buffer'

需修改为:

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)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解决方案

修改代码:

getValue(breakpoint: string): T {
    return Reflect.get(this.options, breakpoint) as T;
}

如何解决编译报错“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标识。

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中添加了如下的插桩配置,但是插桩功能未生效。

"transformLib": "<相对模块根路径的动态库路径,以./开头>"

判断与验证

  1. 进入sdk中es2abc所在目录:[DevEco-Studio安装目录]/Contents/sdk/default/openharmony/ets/build-tools/ets-loader/bin/ark/build-mac/bin。

  2. 执行下列命令:

    ./es2abc --merge-abc --transform-lib <动态库路径> <测试js文件路径>
    
  3. 如果提示类似如下报错信息,原因可能是es2abc和动态库文件不属于一个签名组。

os::library_loader::Load error: dlopen(..., 0x0001): 
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.)
  1. 用下面命令查看es2abc和动态库文件的签名组信息,如果两个文件,一个有签名信息,一个没有签名信息,或者都有签名信息,但是签名信息中属性’TeamIdentifier’的值是不一样的,那就说明问题是签名组不一致导致的,可以使用"解决方案"提供的方式处理。
codesign -dv --verbose=1 <es2abc路径>
codesign -dv --verbose=1 <动态库路径>

解决方案

执行下列命令,将es2abc文件的签名替换成和动态库文件一样的用户签名。

codesign --remove-signature <es2abc路径>
codesign -s - -v <es2abc路径>
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐