Firebase Crashlytics Android NDK:崩溃报告上的空符号

2023-12-10

我在 Android Studio 中有一个项目,其中包含通过 JNI 调用使用一些本机库的 Android Java 服务。

基本上,我有两个编译的库和另一个预编译的库,所以我无法访问源代码。由于预编译库仅为armeabi-v7a 构建,因此我有一个abiFilter。

在这里,我的/build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        google()
        jcenter()

        maven { url 'https://maven.fabric.io/public' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.2'
        classpath 'io.fabric.tools:gradle:1.31.2'
        classpath 'com.google.gms:google-services:4.3.3'  // Google Services plugin

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()

    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

和我的 /app/build.gradle (省略了合理的代码)

apply plugin: 'com.android.application'
apply plugin: 'io.fabric'

def enableCrashlyticsNdk = true

repositories {
    jcenter()
    maven { url 'https://maven.fabric.io/public' }
}

android {
    signingConfigs {
        platformSignature {
            keyAlias "${platform_keystore_alias}"
            keyPassword "${platform_keystore_password}"
            storeFile file("${platform_keystore_path}")
            storePassword "${platform_keystore_password}"
        }
    }

    compileSdkVersion 29
    buildToolsVersion "29.0.2"

    lintOptions {
        abortOnError false
    }

    defaultConfig {
        applicationId com.example.stackoverflowapp
        minSdkVersion 26
        targetSdkVersion 28
        versionCode 1
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11 -Werror"
            }
        }
        ndk {
            // Specifies the ABI configurations of your native
            // libraries Gradle should build and package with your APK.
            abiFilters 'armeabi-v7a'
        }
    }

    buildTypes {
        release {
            minifyEnabled true
            jniDebuggable false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.platformSignature
        }
        debug {
            debuggable true
            jniDebuggable true
            versionNameSuffix = " (debug)"
            signingConfig signingConfigs.platformSignature
        }
    }

    android.applicationVariants.all { variant ->
        variant.outputs.all {
            outputFileName = buildOutputName(variant)
        }
    }

    packagingOptions {
        exclude 'jsr305_annotations/Jsr305_annotations.gwt.xml'
        exclude 'error_prone/Annotations.gwt.xml'
        exclude 'third_party/java_src/error_prone/project/annotations/Annotations.gwt.xml'
        exclude 'third_party/java_src/error_prone/project/annotations/Google_internal.gwt.xml'
    }

    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.2"
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

ext {
    appCompatVersion = '28.0.0'
}

crashlytics {
    enableNdk enableCrashlyticsNdk
}

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

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.recyclerview:recyclerview:1.0.0'
    implementation 'androidx.leanback:leanback:1.0.0'
    implementation 'androidx.appcompat:appcompat:1.0.0'
    implementation 'com.google.android.exoplayer:exoplayer:r1.5.14'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
    implementation 'com.google.code.gson:gson:2.8.5'

    implementation 'com.google.firebase:firebase-analytics:17.2.1'
    implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1'
    implementation 'com.crashlytics.sdk.android:crashlytics-ndk:2.1.1'
}

apply plugin: 'com.google.gms.google-services'  // Google Play services Gradle plugin

由于我的应用程序是 Android 系统的一部分,因此它是使用平台签名进行签名的。

我用 CMake 编译了 2 个库。

我已遵循 firebase web 中的所有步骤:

  1. https://firebase.google.com/docs/android/setup
  2. https://firebase.google.com/docs/crashlytics/get-started?platform=android
  3. https://firebase.google.com/docs/crashlytics/ndk-reports

我故意在我的一个库中添加了崩溃,当应用程序崩溃时,Crashlytics 会收集崩溃并成功上传崩溃报告。

CrashlyticsCore: Crashlytics report upload complete: 5DE66A450116-0001-1A8B-A3EE77BA9366

然后,当我进入 firebase 控制台时,我看到所有堆栈帧都(丢失)

Crashed: Thread #1
SIGSEGV 0x0000000000000028
-------------------------------------------
0 MyApp.apk (Missing)
1 libart.so (Missing)
2 (Missing)
3 (Missing)
4 (Missing)
5 (Missing)
6 (Missing)
7 libart.so (Missing)
8 libart.so (Missing)
9 libart.so (Missing)
10 (Missing)
11 libart.so (Missing)
12 (Missing)

查看 Crashlytics 构建日志,cSym 文件似乎已正确上传。

[DEBUG] (Execution worker for ':' Thread 6) com.crashlytics  - cSYM file(s) uploaded.

我不太确定符号是否正确创建和上传,或者设备创建的崩溃报告是否存在问题。我担心这个问题与 android 权限有关,因为我的应用程序是系统应用程序。

我想我已经阅读了所有与 Crashlytics 和 NDK 相关的 stackoverflow 帖子。另外,我还用谷歌搜索了与“crashlytics、ndk 和符号”相关的任何类型的组合。

最后,我使用的工具版本:

  • 安卓工作室:3.5.1
  • 摇篮:5.4.1
  • Gradle 插件:3.5.2
  • Fabric gradle 插件:1.31.2

太感谢了。


您可能需要考虑升级到新的(非结构)Crashlytics SDK。据推测,它是结构的路线图替代品。

https://firebase.google.com/docs/crashlytics/upgrade-sdk?platform=android

and

https://firebase.google.com/docs/crashlytics/ndk-reports-new-sdk

虽然在撰写本文时它还处于测试阶段,但我最近相当容易地转换为它。在此过程中,我还能够停止在我的本机代码中使用 Fabric 本机库 (libCrashlytics) 及其标头。

此外,作为构建过程的一部分,请确保您将符号正确上传到 Firebase / Fabric。您可能需要明确地执行此操作,作为afterEvaluate像这样阻止:

afterEvaluate {
    if (gradle.startParameter.taskNames.contains(":app:assemble<Flavor><BuildType>")) {
        assemble<Flavor><BuildType>.finalizedBy(uploadCrashlyticsSymbolFile<Flavor><BuildType>)
    }
}

一定要更换<Flavor> and <BuildType>与您在中定义的风格和构建类型productFlavors and buildTypes blocks.

例如,以下风味/构建类型:

buildTypes {
    release {
        signingConfig signingConfigs.release
        buildConfigField "boolean", "RELEASE", "true"
        shrinkResources true
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
    debug {
        buildConfigField "boolean", "RELEASE", "false"
        applicationIdSuffix '.debug'
        versionNameSuffix '-DEBUG'
        ext.alwaysUpdateBuildId = false
        crunchPngs false
    }
}

flavorDimensions "all"

productFlavors {
    fat {
        ndk {
            abiFilters "x86_64", "x86", "arm64-v8a", "armeabi-v7a"
        }
        dimension "all"
    }
}

将导致 assembleFatDebug 和 assembleFatRelease 任务,您需要相应地使用 uploadCrashlyticsSymbolFileFatDebug 和 uploadCrashlyticsSymbolFileFatRelease 任务来完成这些任务。

NOTE:如果您仍在使用 Fabric,那么您想要完成的任务assemble*任务是crashlyticsUploadSymbols<Flavor><BuildType>.

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

Firebase Crashlytics Android NDK:崩溃报告上的空符号 的相关文章

  • 菜单未显示在应用程序中

    由于某种原因 我的操作菜单在我的 Android Studio 应用程序中消失了 我正在按照教程学习如何创建 Android 应用程序 但最终遇到了这个问题 我正在使用 atm 的教程 http www raywenderlich com
  • Android libgdx 首选项丢失

    我在 Libgdx 引擎中创建了 Android 游戏 一段时间后 我注意到在某些应用程序杀手中杀死该应用程序后 或者如果我在 Android 设置中执行 强制关闭 操作 我保存到首选项中的游戏选项就会丢失 有办法防止这种情况吗 我从来没有
  • 接近语法错误(代码1)插入Android SQLite

    我正在创建一个通讯录应用程序 用户可以在其中输入姓名 电子邮件地址和号码 我希望将此数据保存在数据库中 但我似乎无法使插入方法起作用 我收到的错误是 android database sqlite SQLiteException near
  • 在 Android 中使用 DataOutputStream 在 POST 正文中发送特殊字符 (ë ä ï)

    我目前正在开发一个具有大量服务器端通信的 Android 应用程序 昨天 我收到一份错误报告 称用户无法发送 简单 特殊字符 例如 我搜索过但没有找到任何有用的东西 可能重复 没有答案 https stackoverflow com que
  • 在意图过滤器中使用多个操作时的默认值

    尝试理解 Android 中的意图和操作并查看文档 http developer android com guide topics intents intents filters html 但我一直看到的一件事是定义了多个操作的意图过滤器
  • Android 原理图内容提供程序库配置?

    Jake Wharton 在最近的一次演讲中提到了这个库 它看起来是避免大量样板文件的好方法 所以我尝试了一下 但没有任何成功 https github com SimonVT schematic https github com Simo
  • firebase 和 firebase-admin npm 模块有什么区别?

    我想使用 Firebase 身份验证 数据库和存储 构建 Node js Web 应用程序 但我对应该使用哪个模块感到困惑 firebase or firebase 管理员 或两者 管理 SDK 运行您的代码管理权限 https fireb
  • 获取 AlarmManager 中活动的 PendingIntents 列表

    我有办法获取活动列表PendingIntent在设备中 我开始工作AlarmManager我想看看我的PendingIntents 已正确创建和删除 也很高兴看到其他什么PendingIntent在那里 只是为了看看某些应用程序是否正在做一
  • Flutter 深度链接

    据Flutter官方介绍深层链接页面 https flutter dev docs development ui navigation deep linking 我们不需要任何插件或本机 Android iOS 代码来处理深层链接 但它并没
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • Android Studio:无法启动守护进程

    当我尝试在 Android Studio 中导入 gradle 项目时 遇到以下错误 Unable to start the daemon process This problem might be caused by incorrect
  • Android构建apk:控制MANIFEST.MF

    Android 构建 APK 假设一个 apk 包含一个库 jar 例如 foo jar 该库具有 META INF MANIFEST MF 这对于它的运行很重要 但在APK中有一个包含签名数据的MANIFEST MF 并且lib jar
  • Android Webview 图像未加载

    我制作了一个简单的应用程序WebView 但有些图片无法加载 正确 在我的电脑上 错误 在模拟器中 Correct 错误 没有横幅 于是我用Chrome debug进行调试 发现我的代码被改变了 我不添加像noscript or style
  • 材质设计图标颜色

    应该是哪种颜色 暗 材质图标 在官方文档上 https www google com design spec style icons html icons system icons https www google com design s
  • 如何创建像谷歌位置历史记录一样的Android时间轴视图?

    我想设计像谷歌位置历史这样的用户界面 我必须为我正在使用的应用程序复制此 UIRecyclerView 每行都是水平的LinearLayout其中包含右侧的图标 线条和视图 该线是一个FrameLayout具有圆形背景和半透明圆圈Views
  • 下载后从谷歌照片库检索图像

    我正在发起从图库中获取照片的意图 当我在图库中使用 Nexus 谷歌照片应用程序时 一切正常 但如果图像不在手机上 在 Google Photos 在线服务上 它会为我下载 选择图像后 我将图像发送到另一个活动进行裁剪 但在下载的情况下 发
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • Android 如何聚焦当前位置

    您好 我有一个 Android 应用程序 可以在谷歌地图上找到您的位置 但是当我启动该应用程序时 它从非洲开始 而不是在我当前的城市 国家 位置等 我已经在developer android com上检查了信息与位置问题有关 但问题仍然存在
  • 在webview android中加载本地html文件

    我正在尝试在 android 的 webview 中加载 html 文件的内容 但是 它给了我 网页不可用错误 如果我尝试使用谷歌或雅虎等网站 它们就会起作用 html文件位于src gt main gt assests gt index
  • 无法将 admob 与 firebase iOS/Android 项目链接

    我有两个帐户 A 和 B A 是在 Firebase 上托管 iOS Android unity 手机游戏的主帐户 B 用于将 admob 集成到 iOS Android 手机游戏中 我在尝试将 admob 分析链接到 Firebase 项

随机推荐

  • 如何为Azure虚拟机设置自定义域?

    我有一个 Azure 虚拟机 其中包含myvmname northeurope cloudapp azure com设置为 DNS 名称 我希望它是这样的somename my domain com 我是my domain com 如何在虚
  • 如何在 SwiftUI 中阻止文本光标跳到末尾?

    我很好奇 有没有人见过这个问题 或者他们知道如何解决这个问题 我遇到的情况是 编辑导航堆栈中的文本字段时 每次击键时总是将文本光标弹出到字段的末尾 我怀疑这与 SwiftUI 的视图和状态管理有关 但除了 navigationDestina
  • 如何在同一个入口规则中应用 pod 选择器和命名空间选择器?

    Kubernetes 文档例子在这里显示如何将网络策略应用于由 Pod 选择器或命名空间选择器指定的源 我可以指定一个同时满足这两个约束的源吗 例如源可以是部署在名称空间 ingress 中的带有标签 tier web 的 Pod P S
  • JavaScript 正则表达式 - 如何用标签包装匹配项?

    我在 JavaScript 中有一个字符串 我想在其中查找给定短语的所有匹配项并用标签将它们包装起来 我无法在这里找到正确的正则表达式方法来替换不区分大小写的短语并将其替换为自身并在其周围添加其他文本 例如 输入字符串 I like to
  • 如何在文件打开之前拦截文件并决定使用哪个帧

    我正在寻找一些关于如何在打开文件之前拦截文件并决定在哪个框架中打开它的想法 我有一个修改版本frame bufs作者 阿尔普 阿克 https github com alpaker Frame Bufs 这是与当前版本的 Emacs Tru
  • 配置 Ansible playbook 以跳过 Jenkins 初始设置

    您好 我是编写 Ansible Playbooks 的新手 但我正在尝试让我的 Playbook 安装 Jenkins 它安装 Jenkins 很好 但问题是它希望我在安装插件 创建作业等之前进行初始解锁 我在这里多次看到人们说你只需要把它
  • Runtime.getRuntime().exec("C:\cygwin\bin\bash.exe") 没有可读取的输入

    我正在尝试执行一个新进程并从 Java 的输入流中读取数据 我已成功使用 Runtime getRuntime exec String 启动并接收来自多个进程的输入 但是 当我尝试在其他一些进程上使用 exec 时 输入流的 read 方法
  • 由于 SyntaxError,Webpack 无法捆绑

    我对在 Windows 上学习 Django ReactJS 很感兴趣 所以我一步一步地遵循了这个tutorial 现在 我正处于捆绑阶段 当我运行捆绑程序作为快速健全性检查时 node modules bin webpack config
  • Pytesseract Image_to_string 返回 Windows 错误:Python 中的访问被拒绝错误

    我尝试使用 Pytesseract 读取图像中的文本 当我运行以下脚本时 我收到访问被拒绝的消息 from PIL import Image import pytesseract import cv2 import os filename
  • Hadoop - 线程“主”中的异常 java.lang.NullPointerException

    我尝试通过本教程使用适用于 Windows 平台的 Apache Hadoop http www codeproject com Articles 757934 Apache Hadoop for Windows Platform fid
  • ARM 汇编:.LANCHOR0

    我对 ARM 汇编相对缺乏经验 需要帮助理解几行代码 我已经使用 Godbolt 和 ARM gcc 8 2 编译器编译 C 11 代码 并得到了这些汇编代码行 L10 word LANCHOR0 我读到了 LANCHOR0是截面锚点 但这
  • Java 扫描器:nextInt

    我是编程初学者 学习Java 我正在尝试编写一个程序 其中列出了四个不同的选项供用户选择 这是其中的一部分 import java util public class fight public static int upgrade1 0 p
  • 在 IIS 上托管 rc1-final-update1 时出现问题

    当我从 Visual studio 在 IIS Express 中 在我的计算机上运行它时 工作得很好 但是 当我尝试在我的服务器 WS 2012 IIS 8 上托管该网站时 该页面需要很长时间才能加载 我在日志中发现了这个错误 C iis
  • Javascript 处理西里尔文输入

    当我从西里尔文站点获取 json 提要时 数据采用 ufffd 格式而不是西里尔文字符 示例提要 http jsonduit com v1 f l 7sg cb getJsonP 1284131679846 0 因此 当我将源 html 设
  • 使用 tabBar 控制器锁定纵向的 iOS 旋转

    目前正在开发一个使用标签栏控制器的应用程序 该应用程序根本不会旋转到横向模式 所有视图都继承自 baseVieController 在这里我已经实现了 BOOL shouldAutorotateToInterfaceOrientation
  • 在 WAMP 中找不到 MongoClient

    我一整天都在尝试在 WAMP 上运行 MongoDB 它显示错误 致命错误 未找到 MongoClient 类 我有 Windows 64 位 Wamp 32 位 在尝试运行 wamp 64 并失败后 MongoDB 64 位 我从下载了
  • Dojo 无法以编程方式连接 djit 吗?

    有了这个代码 var d new dijit Dialog title Programatic Dialog Creation style width 300px var button1 new dijit form Button labe
  • 在 Three.js 中使用多个几何体时 Canvas 渲染器崩溃

    基于某些参数 通过指定不同的 PI 和 theta 值来创建多个球体几何形状 例如 var parent new THREE Object3D scene add parent var geometry new THREE SphereGe
  • 列表索引超出范围

    这怎么可能 我有一个名为 temp 的列表 这就是我的 python 解释器中的内容 In 150 len temp Out 150 773942 In 151 temp 773942 我得到一个 IndexError 列表索引超出范围 我
  • Firebase Crashlytics Android NDK:崩溃报告上的空符号

    我在 Android Studio 中有一个项目 其中包含通过 JNI 调用使用一些本机库的 Android Java 服务 基本上 我有两个编译的库和另一个预编译的库 所以我无法访问源代码 由于预编译库仅为armeabi v7a 构建 因