Преобразуване в символи или опростяване на трасиранията на стека, свързани със сривове

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

Ако приложението или играта ви са разработени с Java и използвате ProGuard за оптимизиране и усложняване на кода, можете да качвате в Play Console файл за съответствия в ProGuard за всяка версия на продукта си. В случай че приложението или играта ви са разработени с код с директно изпълнение, като например C++, можете да качвате в Play Console файл за преобразуване в символи с цел отстраняване на грешки за всяка версия на продукта си. Това улеснява анализирането и отстраняването на проблемите, предизвикващи сривовете и ANR.

Важно: За опростяване на кода на приложения, компилирани в Java, се поддържат само файлове за съответствия, съвместими с инструмента ReTrace. Това е същият формат, използван от ProGuard или R8.

Стъпка 1: Генериране на файл за преобразуване в символи или опростяване

За да се опростяват или преобразуват в символи данните за сривовете и ANR за определена версия на приложението ви, първо трябва да генерирате необходимите файлове за нея. За да работи опростяването или преобразуването в символи, трябва да генерирате и качвате файл за всяка нова версия на приложението си.

Java: Генериране на файл за съответствия в ProGuard

За да се опростяват трасиранията на стека на Java, първо трябва да генерирате файл за съответствия в ProGuard. За да научите как, посетете сайта на Google Developers.

Код за директно изпълнение: Генериране на файл със символи за отстраняване на грешки

Версия 4.1 или по-нова на приставката на Android за Gradle

Ако проектът ви се компилира във формат Android App Bundle, можете автоматично да включите в него файла за преобразуване в символи с цел отстраняване на грешки. За целта добавете следния код към файла build.gradle на приложението си:

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

Забележка: Ограничението за файла за преобразуване в символи с цел отстраняване на грешки е 800 MB. Ако отпечатъкът на символите за отстраняване на грешки е твърде голям, използвайте SYMBOL_TABLE вместо FULL, за да намалите размера на файла.

Ако проектът ви се компилира в APK файл, използвайте горепосочената настройка за build.gradle, за да генерирате отделно файла със символи за отстраняване на грешки. Ръчно качете в Google Play Console файла със символи за отстраняване на грешки, както е описано по-долу в Стъпка 2: Качване на файл за опростяване или преобразуване в символи. В процеса на компилация приставката на Android за Gradle генерира този файл в следната директория на проекта:

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

Версия 4.0 или по-стара на приставката на Android за Gradle (и други системи за компилиране)

В процеса на компилацията за пакета с приложения или APK файла приставката на Android за Gradle запазва в директория на проекта копие на библиотеките, включващо информацията за отстраняване на грешки. Структурата на директорията е подобна на тази:

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 MB. Ако файлът ви е твърде голям, това вероятно се дължи на факта, че .so файловете съдържат таблица със символи (имена на функции), както и информация за отстраняване на грешки във формат DWARF (файлови имена и редове код). Тези данни не са необходими за преобразуване на кода ви в символи и могат да бъдат премахнати чрез изпълнение на следната команда:

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

Забележка: $OBJCOPY посочва конкретната версия на приложния двоичен интерфейс (ABI), от който премахвате информацията за отстраняване на грешки, например: ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-objcopy

Стъпка 2: Качване на файл за опростяване или преобразуване в символи

За да се опростяват или преобразуват в символи данните за сривовете и ANR за приложението ви, трябва да качвате съответните файлове за всяка негова версия.

Важно: Тази стъпка е задължителна само за програмисти, които използват APK файлове. Ако използвате пакет с приложения и версия 4.1 или по-нова на приставката на Android за Gradle, не е необходимо да правите нищо. Автоматично ще извлечем файла за опростяване от пакета и можете да преминете към Стъпка 3: Преглед на опростените трасирания на стека, свързани със сривове. Можете да научите повече за Android App Bundle на сайта за програмисти за Android.

Качване на файлове посредством Play Console

За да качите файл за опростяване или преобразуване в символи:

  1. Отворете Play Console.
  2. Изберете приложение.
  3. В менюто отляво изберете

    Тестване и публикуване

    > Инструмент за разглеждане на Android App Bundle.
  4. Посредством инструмента за избор в горния десен ъгъл изберете съответния артефакт.
  5. Изберете раздела Изтегляния и превъртете надолу до секцията „Активи“.
  6. Кликнете върху стрелката за качване за файла за съответствия или този за преобразуване в символи с цел отстраняване на грешки (което е приложимо), за да качите файла за опростяване или преобразуване в символи за версията на приложението си.
Качване на файлове посредством API на Google Play за програмисти

За да качвате файлове посредством API на Google Play за програмисти, посетете сайта на Google Developers.

Стъпка 3: Преглед на опростените трасирания на стека, свързани със сривове

След като качите файл за съответствия в ProGuard или файл със символи за отстраняване на грешки за дадена версия на приложението си, ще се опростяват данните за сривовете и грешките от типа ANR, които възникват в бъдеще. На страницата Сривове и ANR на приложението си можете да преглеждате опростените трасирания на стека за отделни сривове и ANR.

  1. Отворете Play Console.
  2. Изберете приложение.
  3. В менюто отляво изберете Наблюдение и подобряване > Показатели за Android > Сривове и ANR.
  4. Изберете срив.
  5. В секцията „Трасирания на стека“ ще видите опростените и преобразуваните в символи трасирания на стека.

Важно: След като качите файл за съответствия за дадена версия на приложението си, ще се опростяват данните само за бъдещите сривове и ANR за нея. Няма да виждате опростени данни за сривовете и ANR, които са възникнали преди качването на файла за съответствия.

Често задавани въпроси

Не искам да използвам функцията на Play Console за опростяване/преобразуване в символи. Мога ли да правя това офлайн?

Play Console използва ndk-stack, за да преобразува в символи трасиранията на стека за приложения с директно изпълнение, и ReTrace за сривове на Java. Ако не споделите файловете си за опростяване, можете да копирате маскираните трасирания на стека, свързани със сривове, от Play Console и да използвате подходящия инструмент офлайн, за да ги преобразувате в символи. Този процес обаче трябва да се извърши ръчно за всяко трасиране, което го прави бавен и времеемък. Ако предоставите файловете си за опростяване, Play Console ще направи това вместо вас.

Качих файла за опростяване/преобразуване в символи. Защо данните за сривовете и ANR продължават да са маскирани?

След като качите файл за съответствия в ProGuard или файл за преобразуване в символи с цел отстраняване на грешки за дадена версия на приложението си, ще се опростяват данните само за сривовете и ANR, които възникват в бъдеще. За да видите опростени данни в Play Console, ще трябва да изчакате, докато бъдат подадени сигнали за нови сривове и ANR от потребителски устройства.

Защо след качването на файла за опростяване/преобразуване в символи данните за сривове и ANR се опростяват само частично?

Причината за това е качването на непълен файл за опростяване/преобразуване в символи. Не забравяйте да включите съответните файлове за цялото си приложение, особено ако използвате сложен или многоетапен процес на компилация. Една от най-често срещаните причини за частично опростяване е използването на библиотека на трета страна. В този случай може да сте в състояние да получите файловете за опростяване от доставчика на библиотеката.

Защо, след като качих файла за опростяване/преобразуване в символи, изглежда, че получавам данни за по-малко, но по-сериозни сривове и ANR?

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

Какво ще стане, ако забравя да кача файла?

Ако забравите да качите файла за нова версия на приложението си, данните за сривовете и ANR отново ще бъдат маскирани. Изпълнете инструкциите по-горе, за да го качите сега. След като качите файл за съответствия в ProGuard или файл със символи за отстраняване на грешки за дадена версия на приложението си, ще се опростяват данните само за сривовете и ANR, които възникват в бъдеще. За да видите опростени данни в Play Console, ще трябва да изчакате, докато бъдат подадени сигнали за нови сривове и ANR от потребителски устройства.

За да не рискувате да забравите да качите файла, бихте могли да промените процеса на компилация така, че да се използват пакети Android App Bundle с версия 4.1 или по-нова на приставката на Android за Gradle. В този случай файлът със символи за отстраняване на грешки може автоматично да бъде включен в Android App Bundle, като изпълните инструкциите на сайта за програмисти за Android.

Какво ще стане, ако кача грешен файл?

Ако качите грешен файл за дадена версия на приложението си, данните за сривовете и ANR отново ще бъдат маскирани. За да качите коригирана версия:

  1. Отворете Play Console.
  2. Изберете приложение.
  3. В менюто отляво изберете

    Тестване и публикуване

    > Инструмент за разглеждане на Android App Bundle
  4. Посредством инструмента за избор в горния десен ъгъл изберете съответния артефакт.
  5. Изберете раздела Изтегляния и превъртете надолу до секцията „Активи“.
  6. Кликнете върху иконата за изтриване до неправилния файл за опростяване или преобразуване в символи.
  7. След като неправилната версия бъде изтрита, кликнете върху иконата за качване и качете правилния файл за версията на приложението си.

След като качите правилния файл за съответствия в ProGuard или файла със символи за отстраняване на грешки, ще се опростяват само данните за сривовете и ANR, които възникват в бъдеще. За да видите опростени данни в Play Console, ще трябва да изчакате, докато бъдат подадени сигнали за нови сривове и ANR от потребителски устройства.

Съвет: За да избегнете риска от качване на неправилна версия на файла, бихте могли да промените процеса на компилация така, че да се използват пакети Android App Bundle с версия 4.1 или по-нова на приставката на Android за Gradle. В този случай файлът със символи за отстраняване на грешки може автоматично да бъде включен в Android App Bundle, като изпълните инструкциите на сайта за програмисти за Android.

Понастоящем използвам APK файлове. Как да премина към Android App Bundle?

Посетете сайта за програмисти за Android, за да започнете.

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

Да.

Защо някои ANR не показват трасиране на стека?

Понякога системата се натъква на ANR, но не може да събере трасирането на стека. В този случай ANR се показва, за да ви предостави по-пълен преглед за стабилността на приложението ви, но самото трасиране на стека не може да бъде показано. Грешките от типа ANR без трасирания на стека се групират по тип и активност. По този начин преглеждането и отстраняването на подобни ANR може да помогне за намаляването на броя ANR без трасирания на стека.

Това полезно ли бе?

Как можем да направим подобрения?

Нуждаете се от още помощ?

Изпробвайте следните стъпки:

Търсене
Изчистване на търсенето
Затваряне на търсенето
Главно меню
8972575950232695156
true
Търсене в Помощния център
true
true
true
true
true
92637
false
false