我正在尝试为我的 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步吗?
这个命令应该是这样的。
首先移动到目录
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>
>./gradlew app:assembleX86_64\
app:uploadCrashlyticsSymbolFileX86_64Release
或者在 gradle 选项卡中手动调用这些任务。它们需要按此顺序执行(首先是汇编,然后是 uploadCrashlyticsSymbolFile...),以确保已为 Crashlytics 创建二进制文件以生成和上传符号文件。回答您的问题:为了使方法名称出现在堆栈跟踪中,您必须在每次构建 NDK 库后显式调用 uploadCrashlyticsSymbolFileBUILD_VARIANT 任务,这是什么意思? Crashlytics 将需要符号文件,以便将崩溃报告转换为具有方法名称和行号的可读堆栈跟踪。
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.
{ }
}
}