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

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

Если вы разработали свое приложение или игру на языке Java и используете ProGuard для оптимизации и обфускации, то можете загрузить файл сопоставления ProGuard в Play Console. Для продуктов, созданных на основе нативного кода, например С++, можно использовать файлы с отладочными символами. Оба типа файлов необходимо загружать отдельно для каждой версии приложения или игры. Это поможет вам анализировать и устранять сбои и ошибки 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'

Примечание. Размер файла с отладочными символами не должен превышать 800 МБ. Если отладочные символы занимают слишком много места, размер файла можно уменьшить. Для этого укажите значение 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-файла или набора 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).

Размер файла с отладочными символами не должен превышать 800 МБ. Если он слишком велик, вероятно, в файлах 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-файлов. Если вы используете набор 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 и сбоям, возникающим после загрузки файла сопоставления ProGuard или файла с отладочными символами. Подождите, пока информация о новых сбоях и ошибках ANR будет получена с устройств пользователей. После этого вы сможете просматривать в Play Console данные с деобфускацией.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Да.

Почему в некоторых ошибках ANR не показывается трассировка стека?

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

Эта информация оказалась полезной?

Как можно улучшить эту статью?
Поиск
Очистить поле поиска
Закрыть поиск
Приложения Google
Главное меню