Трассы стека Crashlytics показывают имя файла как Неизвестный источник, когда Dexguard включен

У меня проблема с отчетами о сбоях от Fabric Crashlytics, когда я включаю Dexguard в своем проекте.

Я включил Dexguard в своем проекте, и он работает очень хорошо. Затем я выполнил инструкции на этой этой странице и добавил упомянутые конфигурации, чтобы позволить фабрике де-запутать мои трассировки стека и отображать правильные отчеты о сбоях. Вот как я применяю плагины fabric и dexguard в build.gradle основного модуля:

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
        }
    }
}

Но когда в сборке выпуска встречается сбой, имя файла, в котором произошел сбой, отсутствует, но все остальное работает правильно, и трассировка стека почти понятна. Вот пример отчета о сбое:

Неизвестные имена исходных файлов

Как вы можете видеть в отчете о сбое, в трассировке стека отсутствует только имя файла. Остальные описания, такие как номера строк и имена методов, полностью в порядке.

Хотя я использую полные имена методов, такие как ir.X.ui.XMainActivity.throwSomething, и номера строк перед Unknown Source, я могу заключить имя файла, в котором произошла ошибка, я бы хотел, чтобы мои трассировки стека отображали имена файлов и были полностью описательными. Я перепробовал много вариантов, много проб и ошибок, но проблема все еще существует.

Что мне не хватает? Как я могу решить эту проблему?

Я использую версию 8.1.0.7 Dexguard, версию 1.21.7 плагина Fabric и версию 2.9.0 библиотеки Crashlytics.

Я обновил плагин Fabric до версии 1.25.1 и библиотеку Crashlytics до версии 2.9.1, но проблема все еще существует.

Я обновил плагин Fabric до версии 1.25.2, версию инструментов сборки до 27.0.3 и версию плагина gradle до 3.1.0, но проблема все еще существует.


person Mohamad Amin    schedule 12.03.2018    source источник
comment
Майк из Fabric здесь. Спасибо за хорошо задокументированный вопрос. Я заметил одну вещь: вы используете 1.21.7 нашего плагина Gradle, который очень старый. Попробуйте выполнить обновление до 1.25.1 и дайте мне знать, если это что-то изменит.   -  person Mike Bonnell    schedule 12.03.2018
comment
Спасибо, Майк, я обновил плагин gradle до версии 1.25.1 и библиотеку Crashlytics до 2.9.1, но это все еще проблематично. Это еще более странно, первая строка показывает: ir.resid.ui.ResidMainActivity.throwSomething (Unknown Source:87469)   -  person Mohamad Amin    schedule 13.03.2018
comment
Обратите внимание, что проблема начинается с XposedBridge - это часть структуры Xposed (в основном Malware Framework), которая расширяет компоненты и перехватывает события. Основное применение, которое я видел, - это бесплатные покупки в приложении или обман в играх. Это зависит от вашего собственного мнения, но, по моему опыту, это вызывает множество отчетов о сбоях для многих приложений, которые на самом деле не требуют исправления при использовании на незараженном устройстве.   -  person Nick Cardoso    schedule 17.04.2018
comment
Проблема не в отчетах о сбоях, а в части «Неизвестный источник», которая появляется вместо имен классов в трассировке стека и видна на изображениях, вставленных в вопрос.   -  person Mohamad Amin    schedule 19.04.2018
comment
Удачи, @MohamadAmin? Это влияет на один из моих проектов с, казалось бы, идентичной конфигурацией с другим работающим проектом ... Меня, честно говоря, сводит с ума то, что что-то настолько глупое может блокировать выпуск.   -  person Damien Diehl    schedule 13.05.2018
comment
Ничто, @ damien-diehl, не кажется мне одной из ошибок Dexguard или Crashlytics, а не нашей конфигурации.   -  person Mohamad Amin    schedule 14.05.2018
comment
Пожалуйста, не размещайте изображения кода.   -  person Donald Duck    schedule 31.05.2018
comment
Unknown Source - это то место, где будет имя файла (например, Something.java:608). Тебе это не нужно. Имя класса (ResidMainActivity) и имя метода (throwSomething) разрешены правильно, и по ним вы можете угадать имя файла или попросить IDE найти класс за вас. Хорошо.   -  person Eugen Pechanec    schedule 16.07.2018


Ответы (3)


Вы можете предпринять следующие шаги для деобфусцированных отчетов о сбоях. Цитируется из документации по аварийной работе firebase.

1. Чтобы сохранить информацию, необходимую Crashlytics для удобочитаемых отчетов о сбоях, добавьте в файл конфигурации следующие строки:

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

2. Чтобы позволить Crashlytics автоматически загружать файл сопоставления ProGuard или DexGuard, удалите эту строку из файла конфигурации:

 -printmapping mapping.txt
person Honey Shah    schedule 17.04.2018
comment
Спасибо, но, как я объяснил в своем вопросе, я сделал и то, и другое с самого начала, и результат такой, как показано в вопросе. - person Mohamad Amin; 18.04.2018
comment
@HoneyShah, не могли бы вы объяснить мне пункт номер 2, пожалуйста? Куда он автоматически загружает файл сопоставления? - person scarface; 18.02.2019

Dexguard шифрует код и скрывает файлы и отчеты о сбоях

Согласно вопросу, все определено правильно, что позволяет создавать отчеты о сбоях, ничего не менять. В моем сценарии проекта тоже самое, используя Dexguard With Fabric.

При интеграции Dexguard в Project, Dexguard шифрует код и скрывает файлы и отчеты о сбоях для других библиотек.

Однако, если вы также используете Google Firebase Crashlytics, вы не сможете увидеть журнал в консоли Firebase. Вы получите тот же отчет, который предоставил Fabric.

Эти Crashlytics будут предоставлять отчеты о сбоях в консоли Google. вы проверяете журнал сбоев в разделе ANR и сбоев в Android Vitals.

В этом разделе показаны все ошибки ANR и сбои, собранные с устройств Android, пользователи которых выбрали автоматический обмен данными об использовании и диагностике. Аномалии могут быть обнаружены только для необфусцированных трассировок стека.

Google объяснил этот раздел https://support.google.com/googleplay/android-developer/answer/6083203

person Keerthivasan    schedule 14.07.2018

Выполните следующие шаги, чтобы правильно получить трассировку стека в Crashlytics.

  1. Войдите в свою Play Console.
  2. Выберите приложение.
  3. В меню слева нажмите Android Vitals> Файлы деобфускации.
  4. Рядом с версией вашего приложения нажмите Загрузить.
  5. Загрузите файл сопоставления ProGuard для версии вашего приложения.

Проверьте эту ссылку: https://support.google.com/googleplay/android-developer/answer/6295281?hl=en

person Avijit Karmakar    schedule 14.07.2018