Crashlytics NDK 如何启用本机符号上传

问题描述 投票:0回答:3

我正在尝试为我的 NDK Android 应用程序启用 crashlytics。我已按照此处的指南进行操作。我陷入了第 2 步。

第 2 步:启用本机符号上传生成可读堆栈: NDK 崩溃的痕迹,Crashlytics 需要了解这些符号 在您的本机二进制文件中。我们的 Gradle 插件包括 uploadCrashlyticsSymbolFileBUILD_VARIANT 任务自动执行此过程 (要访问此任务,请确保将 nativeSymbolUploadEnabled 设置为 正确)。

要使方法名称出现在堆栈跟踪中,您必须明确 在每个之后调用 uploadCrashlyticsSymbolFileBUILD_VARIANT 任务 构建您的 NDK 库。例如:

>./gradlew app:assembleBUILD_VARIANT\ app:uploadCrashlyticsSymbolFileBUILD_VARIANT

For method names to appear in your stack traces, you must explicitly invoke the uploadCrashlyticsSymbolFileBUILD_VARIANT task after each build of your NDK library.

是什么意思?我还看到他们留下了一条带有
gradlew
的线。这是命令行上的命令吗?我很失落。谁能帮我实现第2步吗?

firebase android-ndk crashlytics
3个回答
4
投票
我也曾迷茫过,但终于明白了。

这个命令应该是这样的。

首先移动到目录

cd /YourProjectRootPath/proj.android/
您可以在此目录中找到gradlew文件。

然后执行gradlew运行两个任务。

任务1:assembleDebug或assembleRelease

任务2:uploadCrashlyticsSymbolFileDebug或uploadCrashlyticsSymbolFileRelease

命令是,(调试示例)

./gradlew XXXXXX:assembleDebug XXXXXX:uploadCrashlyticsSymbolFileDebug
请将“XXXXXX”替换为您的“应用程序名称”。

如果您不知道您的应用程序名称是什么,请运行以下命令。

./gradlew tasks --all
可以看到所有任务名称,并且可以找到这两个任务。

XXXXXX:组装调试 XXXXXX:上传CrashlyticsSymbolFileDebug

这个“XXXXXX”是你的“应用程序名称”。

我不知道为什么Google会用“">”和“\”来描述这么复杂的命令,但这只是一个简单的命令,

./gradlew <TASK1> <TASK2>
    

1
投票
当您将“nativeSymbolUploadEnabled true”添加到 gradle 文件时(如

Step1中提到的),这将指示 gradle 插件为每种构建类型和架构生成格式为“uploadCrashlyticsSymbolFileBUILD_VARIANT”的新任务。检查此屏幕截图,其中我只有一种构建类型“发布”,但也有三种架构。生成的任务是:

    上传CrashlyticsSymbolFileArm8Release
  1. 上传CrashlyticsSymbolFileUniversalRelease
  2. 上传CrashlyticsSymbolFileX86_64Release

要运行这些任务,您需要在针对所需构建变体更新的终端中执行命令,例如

>./gradlew app:assembleX86_64\ app:uploadCrashlyticsSymbolFileX86_64Release
或者在 gradle 选项卡中手动调用这些任务。它们需要按此顺序执行(首先是汇编,然后是 uploadCrashlyticsSymbolFile...),以确保已为 Crashlytics 创建二进制文件以生成和上传符号文件。

回答您的问题:为了使方法名称出现在堆栈跟踪中,您必须在每次构建 NDK 库后显式调用 uploadCrashlyticsSymbolFileBUILD_VARIANT 任务,这是什么意思? Crashlytics 将需要符号文件,以便将崩溃报告转换为具有方法名称和行号的可读堆栈跟踪。


0
投票
这是我在每次构建时用来上传符号的方法。它适用于 APK 和 App Bundle (AAB) 构建,并使用 Gradle 任务提供程序来避免 Gradle 任务的早期配置。不知道为什么 Google 不能自动执行此操作 - 也许他们不想让他们的服务器充斥着非最终版本。

afterEvaluate { // Automatic NDK symbols uploading. android.applicationVariants.configureEach { variant -> final def variantName = variant.name.capitalize() final def assembleTaskProvider = variant.assembleProvider final def uploadCrashlyticsSymbolFileTaskName = "uploadCrashlyticsSymbolFile${variantName}" final def bundleTaskName = "bundle${variantName}" try { final def uploadCrashlyticsSymbolFileTaskProvider = project.tasks.named(uploadCrashlyticsSymbolFileTaskName) if (uploadCrashlyticsSymbolFileTaskProvider != null) { // 'assemble***' task is used when building APK. if (assembleTaskProvider != null) { assembleTaskProvider.configure { assembleTask -> // This triggers after task completion assembleTask.finalizedBy(uploadCrashlyticsSymbolFileTaskProvider) } uploadCrashlyticsSymbolFileTaskProvider.configure { uploadCrashlyticsSymbolFileTask -> // This ensures ordering uploadCrashlyticsSymbolFileTask.mustRunAfter(assembleTaskProvider) } } // 'bundle***' task is used when building App Bundle (AAB). try { final def bundleTaskProvider = project.tasks.named(bundleTaskName) if (bundleTaskProvider != null) { bundleTaskProvider.configure { bundleTask -> // This triggers after task completion bundleTask.finalizedBy(uploadCrashlyticsSymbolFileTaskProvider) } uploadCrashlyticsSymbolFileTaskProvider.configure { uploadCrashlyticsSymbolFileTask -> // This ensures ordering uploadCrashlyticsSymbolFileTask.mustRunAfter(bundleTaskProvider) } } } catch (ignored) // Ignore all possible throws from 'named()' API. { } } } catch (ignored) // Ignore all possible throws from 'named()' API. { } }
}

© www.soinside.com 2019 - 2024. All rights reserved.