当您的项目代码需要做打包混淆时,需要上传符号表,进行版本管理。本文介绍制作、上传符号表文件的操作步骤。

前提条件

已添加应用。具体操作,请参见添加应用

符号表格式

  • Android符号表
    xxx.zip
    |-- mapping.txt             --存在多个mapping.txt文件时,需手动合并到一个文件中。
    |-- libxx1.so               --要求与发布的so文件同名。
    |-- libxx2.so
    |-- armeabi-v7a
         |-- libxx3.so          --多个架构时,需将文件放到对应的架构目录中。
    |-- x86
         |-- libxx3.so          --多个架构时,需将文件放到对应的架构目录中。
  • iOS符号表
    xxx.zip
    |-- demo.ios.app.dSYM
        |--Contents
            |--Resources
                |--DWARF
                    |--iOS           --主应用符号,要求与xcode模块同名,路径无限制。
    |-- sdk1                         --sdk1符号,要求与xcode模块同名,路径无限制。
    |-- sdk2                         --sdk2符号,要求与xcode模块同名,路径无限制。
    • 将编译生成的.dSYM文件夹直接打包为.zip文件即可。
    • 如果存在第三方库,可将第三方库与.dSYM文件夹一起打包,目录层级无限制。
    • 如果不存在.dSYM文件,可上传未加密的ipa文件作为符号表。此方式可定位函数名,无法定位文件名及行号。

步骤一:制作符号表文件

制作Android符号表文件

  1. 获取mapping.txt文件。

    根据实际情况设置。一般情况下,可以从如下目录中获取mapping.txt文件。

    <module-name>/build/outputs/mapping/<build-type>/
  2. 生成so文件。

    建议编译时使用-g参数,并加上debug信息。使用此方式时,崩溃堆栈可以解析到代码行级。实际发布时,再使用strip命令去掉调试信息。如果不带debug信息,则只能定位到函数名级。

    下列情况下,so文件需要带有buildid。
    • 不同CPU架构的so文件名一样,放在不同的路径下。
    • 同一个应用版本里,可能有多个版本的so文件,使用了动态加载的技术。

    如何确认so文件带有buildid,请参见常见问题

  3. 制作符号表压缩文件。
    将mapping.txt和so文件按照符号表格式进行压缩生成zip文件。示例如下图所示。符合表

    制作完成后,将符号表压缩文件长传到日志服务移动运维监控中。

制作iOS符号表文件

  1. 获取.dSYM文件。
    通过Xcode打包后,将在.xcarchivedSYMs目录中生成.dSYM文件。iOS符号
    .dSYM文件具备如下特性:
    • 必须通过Xcode打包生成。
    • 每个.dSYM文件至少有一个UUID,该UUID和.app文件的UUID关联。

      如果.dSYM文件对应多个架构,则每个架构的UUID与.app文件的架构分别关联。

    • 不使用该.dSYM文件获取崩溃信息。
    • 符号表中有文件名、方法名、行号等等信息,与可执行文件的十六进制函数地址对应。
  2. 验证.dSYM文件的正确性。
    1. iOS符号表通过UUID进行关联,通过以下命令获取符号表UUID。
      其中Demo.app.dSYM.dSYM文件路径,请根据实际情况替换。
      注意 不同架构对应的UUID不同。
      xcrun dwarfdump --uuid Demo.app.dSYM

      返回如下类似内容,表示符号表的UUID。

      UUID: 49D7DE0F-0A58-3809-8D49-9F65DE3E4A99 (armv7) Demo.app.dSYM/Contents/Resources/DWARF/Demo
      UUID: BE75D4E7-9E87-331F-94D4-907661052E9A (arm64) Demo.app.dSYM/Contents/Resources/DWARF/Demo
    2. 获取.app文件的UUID。

      其中Demo.app/Demo.app文件路径,请根据实际情况替换。

      xcrun dwarfdump --uuid Demo.app/Demo

      返回如下类似内容,表示.app文件的UUID。

      UUID: 49D7DE0F-0A58-3809-8D49-9F65DE3E4A99 (armv7) Demo.app/Demo
      UUID: BE75D4E7-9E87-331F-94D4-907661052E9A (arm64) Demo.app/Demo
    3. 确认符号表UUID与.app文件的UUID是否匹配。

      对比上述两个步骤中的返回结果,如果UUID一致,则表示符号表UUID与.app文件的UUID匹配。如果不匹配,请重新打包或找到正确的.dSYM文件。

    4. 验证符号还原是否成功。
      您可以借助DSYMTools工具进行验证。示例如下图所示。DSYMTools
  3. 制作符号表压缩文件。

    .dSYM文件按照iOS符号表格式压缩为.zip文件。例如将AliyunLogProducer.framework.dSYM(SDK符号表文件)和Demo.ios.app.dSYM(应用程序符号表文件)压缩为.zip文件,如下图所示。

    符号表

    制作完成后,将符号表压缩文件上传到日志服务移动运维监控中。

步骤二:上传符号表文件

  1. 登录日志服务控制台
  2. 日志应用区域,单击移动运维监控
  3. 在应用列表中,单击目标应用。
  4. 创建版本。
    1. 在左侧导航栏中,单击版本管理
    2. 版本管理页签中,单击新建版本
    3. 新建版本对话框中,设置版本子版本版本说明,然后单击确定
  5. 上传符号表。
    1. 在版本列表中,单击目标版本对应的上传
    2. 选择保存时长,然后选择符号表文件。
      上传完成后,5分钟左右生效。

常见问题

  • 如何生成带buildid的so文件?

    检查编译参数,确定没有--build-id=none,即表示生成带buildid的so文件。如果没有buildid,可以添加编译参数ld_flags += -Wl,--build-id=sha1

  • 如何检查so文件是否带buildid?
    通过file命令检查so文件是否带buildid。
    file libsls_producer.so

    返回如下类似结果,表示so文件带buildid。

    libsls_producer.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=3c83e72280f649227f59eb9414f14cadb75de698, stripped
  • 通过Xcode打包后没有生成.dSYM文件,怎么处理?
    请确认目标TARGETS中的Build Options配置是否正确。.dSYM