本文主要讲解在使用 ohos-rs 或者 Rust 开发鸿蒙原生应用模块的时候,当出现一些常见问题的排查思路和方案。
本文不保证能够覆盖到所有的问题内容,主要是在过去一段时间从个人和社区遇到的一些问题上面的总结,有更多总结或者思路方案欢迎评论交流~
1. Can't get OHOS_NDK_HOME.: NotPresent
使用 ohos-rs 的脚手架进行构建的时候,出现如标题所示的报错。一定是因为环境变量配置问题,请检查自己的配置的环境变量是不是符合预期的。
正常的配置完成之后,执行ll $OHOS_NDK_HOME
应该如图所示:
使用 unix 系统的同学请检查自己配置的变量是不是类似于如下:
# 注意必须有 export
export OHOS_NDK_HOME=XXXX
2. 构建时出现 unable to find library -latomic
该问题主要出现在构建armeabi-v7a
构架时,某些包在构建脚本中依赖了libatomic.so
动态依赖库。
比如在 rust-openssl 中存在该问题,
3. OpenSSL 出现提示不支持某些函数或者变量
主要考虑使用的 OpenSSL 版本差异性,目前 OpenSSL 主流的使用版本有1.x
和3.x
这两个版本之间会存在一些差异性。
使用时需要考虑 rust-openssl 和预构建的 OpenSSL 版本跟你期望的版本是对齐的。比如你想要使用 1.x 版本的 OpenSSL,那么对应的 rust-openssl 你需要找到使用 1.x 版本的对应版本并且构建过程中链接的 OpenSSL 动态链接库必须是 1.x 分支构建的。
其中鸿蒙上面 OpenSSL 的预构建库笔者提供了 1.x 和 3.x 两个版本:
- master 为默认版本 3.x
- 111 分支为 OpenSSL 1.x 版本
使用者可以按需选择或者自行构建。
4. IDE 能够debug Rust代码吗?
答案是一定的。与 C++ 构建的代码类似,使用 Rust 构建的模块同样支持 Debug,不过目前 IDE 对于 Rust 变量的可读性支持并不是很好,我们这里给出一个简单的操作步骤。
重要:必须构建 debug 模式的包
首先需要在启动中配置 debugger 模式为 ArkTS + Native 都支持。
选中截图所示的内容然后点击 Apply,然后点击 Debug 启动运行。
然后我们在调用的地方打上断点,当代码执行到断点的时候就可以点击下一步进到我们的 Rust 代码中了。
- 如果你使用的比较旧版本的 IDE,那么比较遗憾的是代码内部没办法直接通过点击新增断点,但是可以通过下面的
lldb
的 tab 使用命令行来实现新增断点- IDE 目前也不支持 Rust 的语法高亮
5. 调用原生模块时出现:xxx is not callble
这种问题一般是由于找不到模块导致的或者运行失败导致的。这种问题分两步定位:
第一步:一般先确定是不是模块加载失败导致的。
在 debug 模式启动后,在截图的 tab 里直接 Ctrl + F 查询你需要调用的方法所在模块,如果加载成功的话则能够搜索到你需要的模块名和文件,如下所示:
第二步:如果成功加载了,就到 log 里面找是不是有报错,一般直接检索模块名即可。
在比较新的 IDE 中这里检索的时候会出现很多跟当前模块名相关的日志信息,根据日志信息排查是否是因为依赖的动态链接库不存在、或者是找不到某些 symbol 符号相关的错误,从而进一步进行排查。
6. 应用启动后直接crash
一般来说当使用 debug 模式启动的时候,直接 crash 会进入到一个汇编的 debug 页面。请不要关闭这个页面,这个是我们排查问题的入口。
在这个汇编的页面中,我们在最下面其实能看到 crash 的堆栈,其中就有实际抛出错误的代码位置:
当我们点击的时候,就会自动跳转到对应的文件和代码行去,我们就可以来排查问题所在。
比如这里,我们可以看到就是asset_eq!
断言失败,导致直接 crash 了,从而进入到了我们刚开始看到的汇编页面中去。
当然这种问题的排查不是很快就能查到的,通常我们需要配合断点来看具体是什么原因导致的。这里我只是简单的给出一些思路。
7. ohrs build 直接报错:expected a table, but found a string for "target.arch64-unknown-linux-ohos.cc"
请检查自己是否通过 config.toml
给鸿蒙的目标平台配置了一些额外的参数,实际上这里强烈建议不要自己配置相关内容,直接使用 ohrs 进行构建即可。
当然这里的报错可能有很多类型,不能够一一列举,如果出现没办法排查的报错。请提 issue
8. 生成的类型文件中有两个export
由于 ohrs 新旧版本导致的问题,建议将依赖升级到如下版本:
[dependencies]
napi-ohos = { version = "1.0.0-beta.2" }
napi-derive-ohos = { version = "1.0.0-beta.2" }
[build-dependencies]
napi-build-ohos = { version = "1.0.0-beta.2" }
9. 运行时找不到 symbol
这也是比较常见的一个问题,这个主要包括:
- 找不到依赖的动态链接库
- 找不到某些 symbol
第一个场景发生很频繁在使用 OpenSSL 的场景下,很多同学忘记将依赖的libcrypto.so
和libssl.so
文件放在应用内,从而导致运行时加载失败。
这个问题,ohrs 已经考虑到了。因此最新的几个版本开始,ohrs 会在构建时将依赖的一些动态链接库一起复制到最终产物文件夹中,开发者只需要将文件夹中内的所有文件放在应用中即可。
第二个场景则是按场景分析,一般情况下都是跟 emu-tls 这个问题类似,可能需要额外的链接一些库来解决,具体可以参考这个文档上面的说明。
尾
以上就是笔者和社区目前遇到的比较高频的一些问题和排查思路,有更多问题欢迎一起交流补充,本文也会持续补充后续的一些常见问题和解决排查思路。
希望这些内容对你开发有所帮助~