Как работает расшифровка стека крашей в Firebase после обфускации и нужно ли публиковать mapping файл
Что проверяют
Понимаете ли вы, откуда Crashlytics берёт читаемый стектрейс, если в релизе классы называются a.b.c. Следом обычно спрашивают, что делать с крашем, который пришёл нерасшифрованным, и где ещё нужен тот же файл.
Как отвечать
При isMinifyEnabled = true R8 переименовывает классы и методы и пишет таблицу соответствий в app/build/outputs/mapping/<variant>/mapping.txt. Устройство шлёт в Crashlytics обфусцированный стек, а расшифровка идёт на сервере Firebase по этой таблице.
Как это связано:
- загрузка: Gradle-плагин
com.google.firebase.crashlyticsсам выгружает mapping после сборки минифицированного варианта задачейuploadCrashlyticsMappingFile<Variant>. Выключается флагомmappingFileUploadEnabledв блокеfirebaseCrashlyticsу buildType; - сопоставление: плагин вшивает в сборку идентификатор mapping-файла, и краш привязывается ровно к таблице этой сборки. Файл от соседнего билда не подойдёт даже при той же
versionCode; - номера строк: чтобы они были в стеке, в
proguard-rules.proоставляют-keepattributes SourceFile,LineNumberTable, а для своих исключений-keep public class * extends java.lang.Exception; - нативный код: для NDK отдельно выгружаются символы задачей
uploadCrashlyticsSymbolFile<Variant>.
Ответ на вторую часть: загружать в Firebase нужно, и плагин делает это сам. Публиковать mapping открыто нельзя, он раскрывает структуру кода. Его хранят как артефакт релиза в CI рядом с AAB. В Play Console при загрузке AAB файл обычно подтягивается из бандла, для APK его загружают вручную. Если краш уже пришёл нерасшифрованным, стек разворачивают локально утилитой retrace из R8 с тем самым mapping.
Где спотыкаются
Собирают релиз без сети или с отключённой выгрузкой, и все краши этой версии в консоли остаются нечитаемыми.
Не сохраняют mapping конкретного релиза. Пересборка того же коммита даст сборку с другим идентификатором, и старые краши к ней не привяжутся.
Считают, что mapping нужен только Firebase, и забывают про Play Console, где краши и ANR тоже приходят обфусцированными.