【问题标题】:Crashlytics Android NDK: missing all symbols in crash reportsCrashlytics Android NDK:在崩溃报告中缺少所有符号
【发布时间】:2018-09-05 19:08:21
【问题描述】:

我们的本地 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 也没有符号!

【问题讨论】:

  • 您可以将 Fabric 插件添加到 Android Studio。 examples.javacodegeeks.com/android/…
  • 如何将符号上传到 Crashlytics?
  • 我一直让 Gradle 构建通过“应用插件:'io.fabric'”来完成。然而,搜索最新的 Gradle 调试输出,fabric 插件运行,fabricGenerateResourcesGenuineDebug(用于 GenuineDebug 构建变体)运行,但我没有看到任何其他 fabric* 或 crash* 任务正在运行的迹象。
  • 另外,如果 Fabric Gradle 插件有一个详细的模式,它实际上会解释自己,即它正在扫描哪些目录,它正在处理哪些 .so,它不处理哪些,那将非常有帮助,等等。就目前而言,它是一个神秘的黑匣子,我现在诱使它寻址我的一个 .so 文件的一部分,而它曾经用于寻址整个 .so 和 C++ 标准库。
  • 我也有同样的问题......面料团队也没有太多帮助......如果你得到答案,请告诉我!

标签: android android-ndk crashlytics crashlytics-android


【解决方案1】:

对于 Java

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

配置 ProGuard 和 DexGuard

我们简化了在您的应用中设置 ProGuard 或 DexGuard 并接收去混淆的崩溃报告。首先,Fabric 内部使用了注解,所以在你的配置文件中加入下面一行:

-keepattributes *Annotation*

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

-keepattributes SourceFile,LineNumberTable

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

对于 C++

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 crashlytics-upload-symbols

Gradle:./gradlew crashlyticsUploadSymbols{Variant}

例如:./gradlew crashlyticsUploadSymbolsRelease

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

【讨论】:

  • 我知道我们禁用了 proguard,但我会检查一下。另外,这不只是针对 Java 还是 proguard 也处理本机二进制文件——我在这里谈论的是 C++ 符号。
  • 明确地说,我得到 Java 崩溃报告就好了,was 得到 C++ 崩溃报告就好了 -- 直到某个时候我输了C++ 崩溃报告中的符号。
  • 谢谢。如前所述,我正在使用最新的 Gradle、Android Gradle 插件和 CMake ——而这全部工作。我刚刚检查过,Google Play 控制台有我们的 C++ 崩溃的符号信息(它只是不会破坏 C++ 符号名称),所以不清楚为什么 Crashlytics 在这里做得如此糟糕。
  • 当你执行 ./gradlew crashlyticsUploadSymbols{Variant} 时什么也没有发生?
  • 我在尝试这个时遇到了一个错误,所以我添加了 crashlytics { enableNdk true manifestPath 'AndroidManifest.xml' } tasks.whenTaskAdded { task -> if (task.name.startsWith('assemble') ) { task.finalizedBy "crashlyticsUploadSymbols" + task.name.substring('assemble'.length()) } } 我以前不需要。这给了我在这个项目中实际编译的代码中的符号,但不是来自我合并的也有符号的 .a 和 .so 文件。
【解决方案2】:

将以下内容添加到您的 gradle.properties 文件中:

android.bundle.enableUncompressedNativeLibs = false

【讨论】:

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