Skip to main content

Harmony(鸿蒙) 符号表

一、什么是符号表?

1. SO符号表

符号表是内存地址与函数名、文件名、行号的映射表。符号表元素如下所示:

<起始地址> <结束地址> <函数> [<文件名:行号>]

对于鸿蒙native crash,为了能快速并准确地定位用户HAP发生Crash的代码位置,Bugly使用符号表对HAP发生Crash的程序堆栈进行解析和还原。 举一个例子:

Harmony Img 1

2. nameCache & sourceMaps文件

在Harmony开发IDE中配置混淆构建HAP或HAR包,详见 鸿蒙代码混淆规则配置鸿蒙构建闭源HAR

Harmony 的nameCache & sourceMaps文件类似Android的mapping,nameCache文件用于混淆前后ts/js符号、变量等名称的前后对应,sourceMaps文件用于混淆前后ts/js的行号对应。

nameCache & sourceMaps文件通过Hap版本 + 构建号来进行关联。例如,对于指定异常上例,Bugly平台通过Hap版本 + 构建号来查找匹配的符号表文件。对于指定的Hap版本和构建号,Bugly符号表平台支持上传多个符号表文件,通过文件名来区分。如同一个版本号 + 构建号,可同时上传以下文件。

  • nameCache.json
  • sourceMaps.json
  • bugly_nameCache.json
  • bugly_sourceMaps.json

Bugly推荐业务将宿主的nameCache文件和sourceMaps文件命名为 nameCache.jsonsourceMaps.json,插件或者组件的符号表文件命名为 xxx_nameCache.jsonxxx_sourceMaps.json,支持通过批量上传,或者多次上传这些符号表文件。如果相同版本号 + 构建号存在已上传同名文件,则继续上传会覆盖之前的同名文件。

提醒
  1. 当前鸿蒙版本HAR包暂时不支持混淆构建生成sourceMaps文件,已向华为鸿蒙团队提需求跟进中。
  2. 如构建闭源规则链接打不开,需要申请华为鸿蒙开发权限。

二、怎么找到符号表?

SO符号表位置

Harmony平台中,Debug SO文件是指具有调试信息的SO文件,其中包含用户还原堆栈的符号信息。Harmony平台编译SO默认使用Dwarf 5格式调试信息,而Android平台通常会使用Dwarf 4/3格式调试信息。

提醒

为了方便找回Crash对应的Debug SO文件和还原堆栈,建议每次构建或者发布Hap版本的时候,备份好Debug SO文件。或者借助Bugly的符号表上传工具,将符号表上传到Bugly平台。

默认情况下,Harmony平台Naitve代码使用CMake编译,Debug编译的Debug SO文件将位于:

<项目文件夹>/<Module>/build/default/intermediates/cmake/debug/obj/<架构>/

Harmony Img 2

nameCache & sourceMaps文件位置

默认情况下,nameCache文件位置在:

<项目文件夹>/<Module>/build/default/cache/default/default@CompileArkTs/esmodule/release/obfuscation/nameCache.json/

默认情况下,sourceMaps文件位置在:

<项目文件夹>/<Module>/build/default/cache/default/default@CompileArkTs/esmodule/release/sourceMaps.json/

Harmony Img 3

提醒

为了方便找回Crash对应的ts还原堆栈,建议每次构建或者发布Hap版本的时候,备份好nameCache和sourceMaps文件。或者借助Bugly的符号表上传工具,将符号表上传到Bugly平台。

三、如何判断SO是否与Crash匹配?

Harmony平台同样使用SO UUID来匹配符号表文件,匹配规则和UUID提取规则可参考 Android符号表

三、如何上传符号表到bugly平台?

方式一:网页上传

详细见 《网页上传符号表》

方式二:工具上传

详细见 《工具上传符号表》