當您的項目代碼需要做打包混淆時,需要上傳符號表,進行版本管理。本文介紹制作、上傳符號表文件的操作步驟。

前提條件

已添加應用。具體操作,請參見添加應用

符號表格式

  • 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