Crashlytics Android NDK:丢失崩溃报告中的所有符号

时间:2018-03-27 11:32:15

标签: android android-ndk crashlytics crashlytics-android

我们的原生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())
    }
}

当这个工作正常时,我不需要它。 (并且,不,只是添加崩解剂块是不够的。)

这给了我实际在这个项目中构建的.cpp文件的符号。它仍然没有我链接的.a文件的符号,甚至对于libc ++ _ shared.so!

也没有符号

2 个答案:

答案 0 :(得分:1)

For 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) - 这些目录由特定于体系结构的文件夹分解。

使用带有externalNativeBuild DSL的Gradle版本2.2.0+的Android插件构建项目时,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:ant crashlytics-upload-symbols

Gradle:./gradlew crashlyticsUploadSymbols{Variant}

例如:./gradlew crashlyticsUploadSymbolsRelease

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

答案 1 :(得分:0)

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

fgets(str, sizeof(str), stdin);