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

При сбоях и ошибках 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 без трассировки стека, они объединяются в группы по типу и классу действия.

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

Как можно улучшить эту статью?
Поиск
Очистить поле поиска
Закрыть поиск
Главное меню
15534394252721730381
true
Поиск по Справочному центру
true
true
true
true
true
92637
false
false