Crashlytics Android NDK:崩溃报告中缺少所有符号

2024-04-02

我们的原生 Crashlytics 崩溃报告最近缺少所有符号信息。我曾希望最新的 Crashlytics NDK 能够解决该问题,但事实并非如此。

我看到那里有一个类似的查询,但在这种情况下,我没有使用 Firebase,只是使用 Crashlytics,并且已经成功执行了相当长的一段时间。

我们的 build.gradle (使用 CMake 和 Gradle 3.0.0 或 3.1.0 Android 插件——无论哪种方式都有同样的问题)包含:

buildscript {
    ...
    dependencies {
        ...
        classpath 'io.fabric.tools:gradle:1.+'
    }
}
...
dependencies {
    ...
    implementation('com.crashlytics.sdk.android:crashlytics:2.9.1@aar') {
        transitive = true
    }
    implementation 'com.crashlytics.sdk.android:crashlytics-ndk:2.0.2'
}

这似乎是正确的,并且使用所有最新的 Fabric 组件,除非我遗漏了一些东西。

然后我补充道:

crashlytics {
    enableNdk true
    manifestPath 'AndroidManifest.xml'
}

tasks.whenTaskAdded { task ->
    if (task.name.startsWith('assemble')) {
        task.finalizedBy "crashlyticsUploadSymbols" + task.name.substring('assemble'.length())
    }
}

前一段时间当它工作时我不需要这些。 (而且,不,仅仅添加 crashlytics 块是不够的。)

这为我在该项目中实际构建的 .cpp 文件提供了符号。它仍然没有我链接的 .a 文件的符号,甚至没有 libc++_shared.so 的符号!


For Java

https://docs.fabric.io/android/crashlytics/dex-and-proguard.html https://docs.fabric.io/android/crashlytics/dex-and-proguard.html

配置 ProGuard 和 DexGuard

我们让您在应用程序中设置 ProGuard 或 DexGuard 并接收去混淆的崩溃报告变得简单。首先,Fabric 在内部使用注释,因此将以下行添加到您的配置文件中:

-keepattributes *Annotation*

接下来,为了提供最有意义的崩溃报告,请将以下行添加到您的配置文件中:

-keepattributes SourceFile,LineNumberTable

如果没有此规则,Crashlytics 仍将运行,但您的崩溃报告将不包含正确的文件名或行号。

For C++

https://docs.fabric.io/android/crashlytics/ndk.html https://docs.fabric.io/android/crashlytics/ndk.html

指定调试和发布二进制文件的路径

为了正确地符号化和处理本机崩溃,我们需要来自本机二进制文件的符号。通常,Android 的本机二进制构建过程会生成两组二进制文件:一组带有调试符号,一组将打包到最终的 APK 中。 Fabric 插件使用两组二进制文件在您的计算机上生成符号文件。符号生成和上传过程假设您的项目将有两个目录 - 一个用于调试二进制文件(下面称为 obj),另一个用于发布二进制文件(下面称为 libs) - 按特定于体系结构的文件夹进行细分。

当使用 Gradle 版本 2.2.0+ 的 Android 插件和 externalNativeBuild DSL 构建项目时,Fabric 插件能够自动检测每个本机构建变体所需的目录,以便生成适当的符号文件。

obj/  
    — armeabi  
        + lib1.so  
        + lib2.so  
    — x86  
        + lib1.so  
        + lib2.so  

libs/  
    — armeabi  
        + lib1.so  
        + lib2.so  
    — x86  
        + lib1.so  
        + lib2.so  

调试和发布二进制文件的路径可以通过 androidNdkOut(默认:src/main/obj)和 androidNdkLibsOut(默认:src/main/libs)属性手动控制。 Ant 用户可以在fabric.properties 文件中修改这些内容。 Gradle 用户可以通过 build.gradle 中的 crashlytics {} 块来控制这些。

Ant: ant crashlytics-upload-symbols

Gradle: ./gradlew crashlyticsUploadSymbols{Variant}

例如:./gradlew crashlyticsUploadSymbolsRelease

您还应该阅读“上传外部依赖项的符号”,它适用于您的代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Crashlytics Android NDK:崩溃报告中缺少所有符号 的相关文章

随机推荐

  • Jenkins - 运行 NuGet 包还原来生成此文件

    当我在 Jenkins 构建服务器上构建 NET Standard 2 0 库时 C Program Files dotnet sdk 2 1 302 Sdks Microsoft NET Sdk targets Microsoft Pac
  • 为什么我的复选框没有映射到 MVC 模型成员?

    我正在尝试实现什么这个答案表明 https stackoverflow com a 10649724 57428但没有将显示名称存储在我的模型代码中 所以我相信这是一个单独的问题 我有 MVC 视图 和一个模型 public class M
  • dask 数据帧的 iloc 相当于什么?

    我遇到一种情况 我需要按位置索引 dask 数据帧 我看到没有 iloc方法可用 还有其他选择吗 或者我是否需要使用基于标签的索引 例如 我想 import dask dataframe as dd import numpy as np i
  • 如何检索 QTableView 的选定行?

    我正在使用QTableView具有该模型的类 class PaletteTableModel QtCore QAbstractTableModel def init self colors headers parent None QtCor
  • 数据未通过 wp_localize_script 正确传递

    我正在尝试将 PHP 数据传递给 JS 脚本 我正在使用 wp localize script 函数 wp register script googlechart https www gstatic com charts loader js
  • 如何从 iframe 读取父页面的页面标题?

    我有一个页面调用另一个页面 在另一台服务器上 我希望该页面从父页面读取标题 这可能吗 或者这是否存在一些安全问题 您无法像这样跨服务器进行通信
  • 如何在金属中使用texture2d_array数组?

    我一直在尝试使用texture2d array来应用金属中的实时滤镜 但我没有得到正确的结果 我像这样创建纹理数组 Code Class MetalTextureArray class MetalTextureArray private s
  • 在 iOS 中使用 WKWebView 请求桌面站点

    我到处搜索 但找不到一种方法来请求网站的桌面版本而不依赖网站本身 他们自己的 桌面版本 按钮 有没有办法做到这一点 我认为如果我可以让它在 UIWebView 中工作 那么在 WKWebView 上也可以以相同的方式完成 如果你只关注iOS
  • 将旧日志从 filebeat 重新发送到logstash

    在此先感谢您的帮助 我想重新加载一些日志来自定义其他字段 我注意到 filebeat 配置中的注册表文件会跟踪已选择的文件 但是 如果我删除该文件中的内容 我将无法恢复旧日志 我还尝试更改注册表文件中源的时间戳 但没有成功 将旧日志从 fi
  • 散景图像绘图的较小范围填充

    我正在使用 bokeh 1 0 4 我想使用 bokeh 生成图像图match aspect True 这是用于说明的示例代码 from bokeh models ranges import DataRange1d from bokeh p
  • Tomcat 热部署不工作

    我在 Tomcat 6 服务器上热部署新的 WAR 时遇到问题 当我添加新的 WAR 时 我可以看到 Tomcat 正在尝试部署它 但是 我认为问题在于取消部署旧的 war 展开的 war 文件夹的内容全部被删除 除了 WEB INF 文件
  • Azure数据工厂自动重新触发失败的管道

    我想使用 If Condition Activity 动态内容 自动重新触发失败的管道 过程 管道 1 在计划时间使用触发器 1 运行 有效 如果管道 1 失败 计划触发器 2 将运行管道 2 有效 管道 2 应包含 if 条件来检查管道
  • 从函数提前返回是否比 if 语句更优雅?

    我自己和一位同事对于以下哪一个更优雅存在争议 我不会说谁是谁 所以这是公正的 哪个更优雅 public function set hitZone target DisplayObject void if hitZone target hit
  • 自定义 jQuery 子菜单定位

    我正在尝试创建一个至少有两层子菜单的水平菜单 所有子菜单都是垂直的 Submenu1 将位于其父菜单的正下方 所有后续子菜单级别 2 应位于其父菜单的右侧 我刚刚开始学习如何使用 jQuery 菜单 他们似乎没有对此进行自定义 我不知道如何
  • 计算机如何进行浮点运算?

    我看过很长的文章解释如何存储浮点数以及如何完成这些数字的算术运算 但请简要解释一下为什么当我写的时候 cout lt lt 1 0 3 0 lt
  • 从头开始创建,还是从头开始构建?

    我正在考虑建立一个可视化编程语言 http en wikipedia org wiki Visual programming language 类似于Scratch http scratch mit edu 供儿童 又称可怜的打字员 在对微
  • Go中如何生成固定长度的随机数?

    在 Go 中生成固定长度随机数的最快 最简单的方法是什么 假设要生成8位长数字 问题是rand Intn 100000000 是结果可能远小于 8 位数字 并且用前导零填充它对我来说看起来不是一个好的答案 也就是说 我更关心随机性的质量 因
  • 将 Visual Studio 2008 指向第三方 DLL 的源代码进行调试

    我有一个 VS 2008 C 项目 它使用第三方库 开放场景图 当我开始调试项目时 每次调用此外部库中的函数时 调试器都会跳过它 因为 显然 调试器没有可在其中查找代码的 cpp 文件 它只会跳转到链接到我的项目的头文件 因为这些文件存在并
  • 如何将 Semantic-UI 导入 Angular 项目

    我正在开发一个基于 Semantic UI 框架 这是 Semantic UI 的一个分支 的 Angular 项目 我已经安装了 npm install save fomantic ui 然后我在中添加了以下几行angular json
  • Crashlytics Android NDK:崩溃报告中缺少所有符号

    我们的原生 Crashlytics 崩溃报告最近缺少所有符号信息 我曾希望最新的 Crashlytics NDK 能够解决该问题 但事实并非如此 我看到那里有一个类似的查询 但在这种情况下 我没有使用 Firebase 只是使用 Crash