Трассировки стека ошибок: деобфускация или добавление отладочных символов

Эта статья предназначена только для пользователей новой бета-версии Play Console. Если вам нужна информация о классической версии, откройте страницу Справочного центра Play Console.

Чтобы узнать больше о новой бета-версии Play Console, прочитайте эту запись в нашем блоге.

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

Если вы разработали свое приложение или игру на Java и используете ProGuard для оптимизации и обфускации файлов APK, то можете загрузить файл сопоставления ProGuard в Play Console. Для приложений на основе нативного кода, например C++, используются файлы отладочных символов. Оба типа файлов необходимо загружать отдельно для каждой версии приложения. Это поможет вам проанализировать и устранить сбои и ошибки ANR.

Важно! Для деобфускации приложений, скомпилированных в Java, поддерживаются только файлы сопоставления, совместимые с ReTrace. Этот же формат используется в файлах ProGuard и R8.

Шаг 1. Сгенерируйте файл деобфускации или файл отладочных символов

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

Java: файл сопоставления ProGuard

Для деобфускации Java-приложений вам потребуется файл сопоставления ProGuard. О том, как его создать, рассказывается на сайте Google Developers.

Нативный код: файл отладочных символов

Плагин Android Gradle 4.1 или более поздней версии

Если для сборки вы используете формат Android App Bundle, файл отладочных символов может добавляться в нее автоматически. Для этого включите следующую строку в файл build.gradle вашего приложения:

  • android.defaultConfig.ndk.debugSymbolLevel = 'FULL'

Примечание. Размер файла отладочных символов не должен превышать 300 МБ. Если отладочные символы занимают слишком много места, размер файла можно уменьшить. Для этого укажите значение SYMBOL_TABLE вместо FULL.

Если же вы выбрали формат APK, добавьте указанный выше параметр в файл build.gradle, и файл отладочных символов будет создан отдельно. Загрузите полученный файл в Google Play Console (см. шаг 2). В процессе сборки плагин Android Gradle создает этот файл в следующем местоположении:

  • app/build/outputs/native-debug-symbols/variant-name/native-debug-symbols.zip

Плагин Android Gradle 4.0 или более ранней версии (и другие системы сборки)

В процессе сборки APK-файла или набора Android App Bundle плагин Android Gradle сохраняет исходные копии библиотек (то есть не обработанные с помощью команды strip) в каталоге проекта. Пример структуры такого каталога:

app/build/intermediates/cmake/universal/release/obj

├── armeabi-v7a/

│   ├── libgamenegine.so

│   ├── libothercode.so

│   └── libvideocodec.so

├── arm64-v8a/

│   ├── libgamenegine.so

│   ├── libothercode.so

│   └── libvideocodec.so

├── x86/

│   ├── libgamenegine.so

│   ├── libothercode.so

│   └── libvideocodec.so

└── x86_64/

    ├── libgameengine.so

    ├── libothercode.so

    └── libvideocodec.so

Примечание. Если вы используете другую систему сборки, внесите изменения, чтобы структура каталогов, в которых сохраняются эти библиотеки, соответствовала указанной выше.

  1. Заархивируйте содержимое следующего каталога:
    • $ cd app/build/intermediates/cmake/universal/release/obj
    • $ zip -r symbols.zip
  2. Загрузите вручную файл symbols.zip в Play Console (см. шаг 2).

Размер файла отладочных символов не должен превышать 300 МБ. Если он слишком велик, вероятнее всего, в файлах SO содержится таблица имен (названия функций), а также сведения для отладки DWARF (названия файлов и строки кода). Эта информация не нужна для добавления отладочных символов. Чтобы удалить ее, выполните следующую команду:

  • $OBJCOPY --strip-debug lib.so lib.so.sym

Примечание. $OBJCOPY указывает на определенную версию двоичного интерфейса приложения, к которой применяется команда strip, например: ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-objcopy.

Шаг 2. Загрузите файл деобфускации или файл отладочных символов

Теперь вам нужно загрузить полученные файлы в Play Console.

Важно! Этот шаг предназначен только для разработчиков APK-файлов. Если вы используете набор Android App Bundle и плагин Android Gradle 4.1 или более поздней версии, выполнять его не требуется. Файл деобфускации будет автоматически взят из набора, поэтому вам можно сразу переходить к шагу 3. Узнать больше о наборах App Bundle можно на сайте для разработчиков Android.

Как загрузить файлы с помощью Play Console

Для этого выполните следующие действия:

  1. Откройте Play Console.
  2. Выберите приложение.
  3. В меню слева нажмите Версия > Устройства и версии > App Bundle Explorer.
  4. В окне выбора в правом верхнем углу экрана укажите нужный объект.
  5. Откройте вкладку Загрузки и прокрутите экран вниз до раздела "Ресурсы".
  6. Нажмите на значок загрузки рядом с нужным типом файла.
Как загрузить файлы с помощью Google Play Developer API

Информация о загрузке через API приводится на сайте Google Developers.

Шаг 3. Посмотрите трассировки стека ошибок после деобфускации

После того как вы загрузите эти файлы в Play Console, к последующим сбоям и ошибкам ANR будет применяться деобфускация. Трассировки стека для них можно посмотреть на странице приложения Сбои и ANR.

  1. Откройте Play Console.
  2. Выберите приложение.
  3. В меню слева нажмите Качество > Android Vitals > Сбои и ANR.
  4. Выберите ошибку.
  5. В разделе "Трассировка стека" вы увидите трассировки после деобфускации и добавления отладочных символов.

Важно! Деобфускация будет применяться только к тем сбоям и ошибкам ANR, которые возникнут после загрузки файла сопоставления. К более ранним сбоям и ошибкам ANR она не применяется.

Часто задаваемые вопросы

Я не хочу применять деобфускацию или добавлять отладочные символы в Play Console. Можно ли сделать это в офлайн-режиме?

Для добавления символов в нативных приложениях в Play Console используется ndk-stack, а в Java-приложениях – ReTrace. При желании вы можете скачать необработанные стеки ошибок из Play Console, а затем добавить в них отладочные символы в одном из указанных выше инструментов. Однако эти действия необходимо выполнять вручную для каждого стека ошибок, что замедляет процесс и отнимает много времени. Загрузите файлы деобфускации, и Play Console всё сделает за вас.

Почему после загрузки файла деобфускации или файла отладочных символов ошибки ANR и сбои по-прежнему обфусцируются?

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

Почему после загрузки файла деобфускации или файла отладочных символов ошибки ANR и сбои деобфусцированы только частично?

Потому что файл деобфускации или файл отладочных символов загружен не полностью. Убедитесь, что вы загружаете файл отладочных символов для всего приложения, особенно если используете комплексный или многоэтапный процесс сборки. Нередко частичная деобфускация связана с использованием сторонних библиотек. В этом случае нужно запросить файлы деобфускации у поставщика библиотеки.

Почему после загрузки файла деобфускации или файла отладочных символов число ошибок ANR и сбоев уменьшается, но они становятся критичнее?

Без файлов деобфускации одинаковые ошибки ANR или сбои на 32- и 64-разрядных устройствах либо на устройствах ARM и Intel будут показаны отдельно. После загрузки файлов деобфускации мы можем объединить эти сбои в группы, чтобы нагляднее показать наиболее серьезные ошибки ANR и сбои в вашем приложении.

Что, если я забуду загрузить файл?

Если вы забудете загрузить файл для новой версии приложения, ошибки ANR и сбои снова будут обфусцироваться. Загрузите файл, следуя инструкциям выше. Деобфускация применяется только к ошибкам ANR и сбоям, возникающим после загрузки файла сопоставления или файла отладочных символов. Подождите, пока информация о новых сбоях и ошибках ANR будет загружена с устройств пользователей. После этого вы сможете просматривать данные с деобфускацией.

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

Что, если я загружу не тот файл?

Если вы загрузите файл для другой версии приложения, ошибки ANR и сбои будут обфусцироваться. Чтобы исправить это, сделайте следующее:

  1. Откройте Play Console.
  2. Выберите приложение.
  3. В меню слева нажмите Версия > Устройства и версии > App Bundle Explorer.
  4. В окне выбора в правом верхнем углу экрана укажите нужный объект.
  5. Откройте вкладку Загрузки и прокрутите экран вниз до раздела "Ресурсы".
  6. Нажмите на значок удаления напротив неправильного файла деобфускации или файла отладочных символов.
  7. После того как он будет удален, нажмите на значок загрузки и выберите файл, подходящий для данной версии приложения.

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

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

Я использую формат APK. Как перейти к работе с наборами App Bundle?

Информация об этом приводится на сайте для разработчиков Android.

Мое приложение содержит и нативный, и Java-код. Можно ли одновременно загрузить файл отладочных символов для нативного кода и файл деобфускации для Java?

Да.

Эта информация оказалась полезной?
Как можно улучшить эту статью?

Требуется помощь?

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