【问题标题】:Crashlytics NDK symbol building from command line从命令行构建 Crashlytics NDK 符号
【发布时间】:2017-03-01 06:09:48
【问题描述】:

我正在尝试将 Crashlytics 支持添加到我的 Android 项目中,该项目使用 NDK 和 gradle CMake。这意味着我的共享项目需要符号。因此,如果我想为发布版本创建符号,我会调用 gradlew crashlyticsUploadSymbolsRelease

https://docs.fabric.io/android/crashlytics/ndk.html 中的官方文档说 符号生成和上传过程采用标准项目结构:src/main/obj 用于调试二进制文件,src/main/libs 用于 ndk 生成的发布二进制文件-构建。

在 gradle 文件中,这意味着一个新的块,如下所示:

crashlytics {
    enableNdk true
    androidNdkOut 'src/main/obj'
    androidNdkLibsOut 'src/main/libs'
}

因为我正在使用 gradle CMake 集成来构建我的原生库,所以默认路径当然不起作用。我在发布模式下的本机库内置在 build/intermediates/cmake/release/obj 目录中,在调试模式下它们转到 build/intermediates/cmake/debug/obj 目录。

通过反复试验,我发现如果我想让我的发布版本正常工作,我必须将发布模式本机库的路径放入两行中,如下所示。

crashlytics {
    enableNdk true
    androidNdkOut 'build/intermediates/cmake/release/obj'
    androidNdkLibsOut 'build/intermediates/cmake/release/obj'
}

我真的不明白androidNdkOutandroidNdkLibsOut 变量之间的区别,因为至少在我的场景中它们指向同一个目录。幸运的是,这对我来说不是问题,因为我只需要 Crashlytics 来处理我的发布二进制文件。

所以我的问题是:

1) androidNdkOutandroidNdkLibsOut 之间的真正区别是什么?为什么我不能将调试二进制文件的路径放在一个和将二进制文件发布到另一个的路径?除了解释之外,一个具体的例子会很好。

2) 如果有一天我还想为我的调试库包含符号,我应该如何修改我的 gradle 文件?意思是命令 gradlew crashlyticsUploadSymbolsReleasegradlew crashlyticsUploadSymbolsDebug 可以吗?

Crashlytics NDK symbols and Gradle tasksCrashlytics NDK multi androidNdkOut path support 的线程中对此进行了讨论,但他们确实没有回答这两个问题。

【问题讨论】:

  • 行号是否正常工作?您在哪里找到未剥离的二进制文件?您提供的那些路径仅包含剥离的 .so,不是吗?

标签: android-ndk cmake android-gradle-plugin crashlytics-android


【解决方案1】:

我在维护 Crashlytics NDK 支持的 Fabric 团队工作。

为了提供一些背景信息 - 我们的符号上传工具基于 ndk-build 进程,该进程生成 2 组二进制文件:您的生产二进制文件,其中去除了符号数据,以及调试二进制文件,其符号数据完整,用于调试目的.

Gradle 属性映射到ndk-build 进程中的变量,具体来说:

  • androidNdkOut 是放置未剥离的调试二进制文件的目录(相当于ndk-build 中的$NDK_OUT 变量),默认称为obj
  • androidNdkLibsOut 是放置已剥离、发布二进制文件的目录(相当于ndk-build 中的$NDK_LIBS_OUT 变量),默认情况下称为libs

这些路径的预期内容是您的库的特定于体系结构的目录,例如:

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

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

要使我们的符号上传正常工作,您需要做的就是从 CMake 生成这些相同的二进制文件集,然后将您的 androidNdkOutandroidNdkLibsOut 设置到可以存放这些库的相应顶级目录找到了。

编辑/更新 2017 年 7 月 7 日

我们刚刚发布了用于 Gradle 的 Fabric 插件 1.23.0 版,当您使用带有 externalNativeBuild DSL 的 Android Gradle 插件 2.2.0+ 时,它支持自动解析适当的原生库路径,所以您不需要如果您使用的是最新的 Android Gradle 插件,则不再需要设置 androidNdkOutandroidNdkLibsOut。在此处查看更多信息:https://docs.fabric.io/android/crashlytics/ndk.html#specifying-the-path-to-debug-and-release-binaries

【讨论】:

  • 我依赖于一个原生的 3rd 方模块,当我构建我的项目时,我找不到 crashlyticsUploadSymbolsRelease。我们可以为库添加 ndk 支持吗?
  • crashlytics 生成符号以上传它们。但仍然在仪表板上我看不到堆栈跟踪。 gradle 工具 3.21,ndk 14,
  • Crashlytics 似乎不再能够做到这一点,提交了一个错误。请查看我的 Q stackoverflow.com/questions/57931385/…,如果有人可以提供帮助,那就太好了
【解决方案2】:

如果 mWillis 提到的自动检测对您不起作用,请查看隐藏的日志文件:

~/.crashlytics/com.crashlytics.tools/crashlytics.log

无论出于何种原因,谷歌都没有指出这一点,fabric.io 文档中似乎也缺少它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多