使用 ohos-rs/Rust 开发鸿蒙原生模块常见问题以及排查方案和思路

1,087 阅读6分钟

本文主要讲解在使用 ohos-rs 或者 Rust 开发鸿蒙原生应用模块的时候,当出现一些常见问题的排查思路和方案。

本文不保证能够覆盖到所有的问题内容,主要是在过去一段时间从个人和社区遇到的一些问题上面的总结,有更多总结或者思路方案欢迎评论交流~

1. Can't get OHOS_NDK_HOME.: NotPresent

使用 ohos-rs 的脚手架进行构建的时候,出现如标题所示的报错。一定是因为环境变量配置问题,请检查自己的配置的环境变量是不是符合预期的。

正常的配置完成之后,执行ll $OHOS_NDK_HOME应该如图所示:

17196231309393.jpg

使用 unix 系统的同学请检查自己配置的变量是不是类似于如下:

# 注意必须有 export
export OHOS_NDK_HOME=XXXX

2. 构建时出现 unable to find library -latomic

该问题主要出现在构建armeabi-v7a构架时,某些包在构建脚本中依赖了libatomic.so动态依赖库。

比如在 rust-openssl 中存在该问题,

3. OpenSSL 出现提示不支持某些函数或者变量

主要考虑使用的 OpenSSL 版本差异性,目前 OpenSSL 主流的使用版本有1.x3.x这两个版本之间会存在一些差异性。

使用时需要考虑 rust-openssl 和预构建的 OpenSSL 版本跟你期望的版本是对齐的。比如你想要使用 1.x 版本的 OpenSSL,那么对应的 rust-openssl 你需要找到使用 1.x 版本的对应版本并且构建过程中链接的 OpenSSL 动态链接库必须是 1.x 分支构建的。

其中鸿蒙上面 OpenSSL 的预构建库笔者提供了 1.x 和 3.x 两个版本:

  1. master 为默认版本 3.x
  2. 111 分支为 OpenSSL 1.x 版本

使用者可以按需选择或者自行构建。

4. IDE 能够debug Rust代码吗?

答案是一定的。与 C++ 构建的代码类似,使用 Rust 构建的模块同样支持 Debug,不过目前 IDE 对于 Rust 变量的可读性支持并不是很好,我们这里给出一个简单的操作步骤。

重要:必须构建 debug 模式的包

首先需要在启动中配置 debugger 模式为 ArkTS + Native 都支持。

17196239825642.jpg

17196240084276.jpg

选中截图所示的内容然后点击 Apply,然后点击 Debug 启动运行。

然后我们在调用的地方打上断点,当代码执行到断点的时候就可以点击下一步进到我们的 Rust 代码中了。

17196242876206.jpg

17196253526312.jpg

  1. 如果你使用的比较旧版本的 IDE,那么比较遗憾的是代码内部没办法直接通过点击新增断点,但是可以通过下面的lldb的 tab 使用命令行来实现新增断点
  2. IDE 目前也不支持 Rust 的语法高亮

5. 调用原生模块时出现:xxx is not callble

这种问题一般是由于找不到模块导致的或者运行失败导致的。这种问题分两步定位:

第一步:一般先确定是不是模块加载失败导致的。

在 debug 模式启动后,在截图的 tab 里直接 Ctrl + F 查询你需要调用的方法所在模块,如果加载成功的话则能够搜索到你需要的模块名和文件,如下所示:

17196260789566.jpg

第二步:如果成功加载了,就到 log 里面找是不是有报错,一般直接检索模块名即可。

在比较新的 IDE 中这里检索的时候会出现很多跟当前模块名相关的日志信息,根据日志信息排查是否是因为依赖的动态链接库不存在、或者是找不到某些 symbol 符号相关的错误,从而进一步进行排查。

17196262217629.jpg

6. 应用启动后直接crash

一般来说当使用 debug 模式启动的时候,直接 crash 会进入到一个汇编的 debug 页面。请不要关闭这个页面,这个是我们排查问题的入口。

在这个汇编的页面中,我们在最下面其实能看到 crash 的堆栈,其中就有实际抛出错误的代码位置:

17196272107857.jpg

当我们点击的时候,就会自动跳转到对应的文件和代码行去,我们就可以来排查问题所在。

17196272602553.jpg

比如这里,我们可以看到就是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.solibssl.so文件放在应用内,从而导致运行时加载失败。

这个问题,ohrs 已经考虑到了。因此最新的几个版本开始,ohrs 会在构建时将依赖的一些动态链接库一起复制到最终产物文件夹中,开发者只需要将文件夹中内的所有文件放在应用中即可。

第二个场景则是按场景分析,一般情况下都是跟 emu-tls 这个问题类似,可能需要额外的链接一些库来解决,具体可以参考这个文档上面的说明。

以上就是笔者和社区目前遇到的比较高频的一些问题和排查思路,有更多问题欢迎一起交流补充,本文也会持续补充后续的一些常见问题和解决排查思路。

希望这些内容对你开发有所帮助~