当Dexguard启用时,Crashlytics的堆栈跟踪将文件名显示为未知来源

时间:2018-03-12 09:41:31

标签: android stack-trace google-fabric crashlytics-android dexguard

当我在项目中启用Dexguard时,我的Fabric Crashlytics崩溃报告出现了问题。

我在项目中启用了Dexguard,效果非常好。 然后我按照this page中的说明进行操作,并添加了上述配置,以使Fabric对我的堆栈跟踪进行去混淆并显示正确的崩溃报告。以下是我在主模块build.gradle中应用fabric和dexguard插件的方法:

apply plugin: 'com.android.application'
apply plugin: 'dexguard'
apply plugin: 'io.fabric'

以下是我的proguard-project.txt文件中的配置:

# Fabric
#############################################################################
-keepattributes *Annotation*,SourceFile,LineNumberTable
-keep public class * extends java.lang.Exception
-keepresourcexmlelements manifest/application/meta-data@name=io.fabric.ApiKey
-keep class com.crashlytics.** { *; }
-dontwarn com.crashlytics.**
#############################################################################

以下是我在发布版本中使用proguard-project.txt的方法:

buildTypes{
    debug{
        proguardFile getDefaultDexGuardFile('dexguard-debug-shrink.pro')
        proguardFile 'proguard-project.txt'
    }
    release{
        proguardFile getDefaultDexGuardFile('dexguard-release.pro')
        proguardFile 'proguard-project.txt'
        proguardFile 'dexguard-project.txt'
        if(new File("$projectDir/../local.properties").exists()){
            signingConfig signingConfigs.release
        }
    }
}

但是当发布版本中遇到崩溃时,发生崩溃的文件名丢失了,但其他所有内容都正常工作,堆栈跟踪几乎可以理解。以下是崩溃报告示例:

Unknown source file names

正如您在崩溃报告中所看到的,堆栈跟踪中只缺少文件名。行号和方法名称等其他描述完全没问题。

虽然使用完整的方法名称(如ir.X.ui.XMainActivity.throwSomething)和Unknown Source前面的行号,但我可以得出错误发生的文件名,我希望我的堆栈跟踪显示文件名并完全是描述性的。我尝试了很多选项和许多试验和错误,但问题仍然存在。

有什么我想念的吗?我该如何解决这个问题?

我正在使用Dexguard的版本8.1.0.7,Fabric插件的版本1.21.7和Crashlytics库的版本2.9.0

我将Fabric插件更新为版本1.25.1,将Crashlytics库更新为版本2.9.1,但问题仍然存在。

我将Fabric插件更新为版本1.25.2,将工具版本更新为27.0.3,并将插件版本更新为3.1.0,但问题仍然存在。

3 个答案:

答案 0 :(得分:10)

您可以针对反混淆的崩溃报告执行以下步骤。 引自firebase crashlytics documentation

  

1.要保留Crashlytics对可读崩溃报告的需求,请添加       配置文件的以下行:

 -keepattributes *Annotation*
 -keepattributes SourceFile,LineNumberTable
 -keep public class * extends java.lang.Exception
  

2.要让Crashlytics自动上传ProGuard或DexGuard映射文件,请从配置文件中删除此行:

 -printmapping mapping.txt

答案 1 :(得分:4)

  

Dexguard加密代码并混淆文件和崩溃报告

根据问题,正确定义了所有内容,可以启用崩溃报告,没有任何更改。在“我的项目方案”中也是如此,使用Dexguard With Fabric。

将Dexguard集成到Project中时,Dexguard会对代码进行加密,并混淆其他库的文件和崩溃报告。

但是,如果您还使用Google Firebase Crashlytics,则无法在Firebase控制台中查看日志。您将获得Fabric提供的相同报告。

这些Crashlytics将在Google控制台中提供崩溃报告。您可以在Android Vitals的ANR和崩溃部分中查看崩溃日志。

该部分显示了从Android设备收集的所有ANR和崩溃,这些设备的用户已选择自动共享使用情况和诊断数据。只能检测到未混淆的堆栈轨迹异常。

Google对https://support.google.com/googleplay/android-developer/answer/6083203部分进行了解释

答案 2 :(得分:4)

按照以下步骤在Crashlytics中正确获取堆栈跟踪

  1. 登录到您的Play控制台。
  2. 选择一个应用。
  3. 在左侧菜单上,单击Android vitals>去模糊文件。
  4. 在您的应用版本旁边,点击“上载”。
  5. 为您的应用版本上载ProGuard映射文件。

检查此链接: https://support.google.com/googleplay/android-developer/answer/6295281?hl=en