Usuwanie zaciemnienia kodu i symbolizacja zrzutów stosu w przypadku awarii

Awarie i błędy ANR na Androidzie powodują utworzenie zrzutów stosu, czyli zapisu sekwencji funkcji zagnieżdżonych wywołanych w programie do momentu awarii. Takie zapisy mogą Ci pomóc w znalezieniu problemów w źródle i ich naprawieniu.

Jeśli Twoja aplikacja lub gra została opracowana w języku Java, a do optymalizowania i zaciemniania kodu aplikacji używasz ProGuard, w Konsoli Play możesz przesłać plik mapowania ProGuard dla każdej wersji aplikacji. Jeśli Twoja aplikacja lub gra została opracowana przy użyciu kodu natywnego, np. języka C++, w Konsoli Play możesz przesłać plik symboli debugowania dla każdej wersji aplikacji. Jeśli to zrobisz, będzie Ci łatwiej przeanalizować awarie i błędy ANR, a w rezultacie je naprawić.

Ważne: do usuwania zaciemnienia kodu aplikacji skompilowanych w języku Java można używać tylko plików mapowania zgodnych z ReTrace. To format identyczny z tym używanym w przypadku ProGuard i R8.

Krok 1. Wygeneruj plik do odczytywania zaciemnionego kodu lub symbolizacji

Aby usunąć zaciemnienie kodu lub przeprowadzić symbolizację danych o awariach i błędach ANR w danej wersji aplikacji, musisz najpierw wygenerować wymagane pliki dla tej samej wersji aplikacji. Aby usunięcie zaciemnienia lub symbolizacja były możliwe, należy wygenerować i przesłać plik dla każdej nowej wersji aplikacji.

Java: generowanie pliku mapowania ProGuard

Aby usunąć zaciemnienie kodu Java w zrzucie stosu, najpierw musisz wygenerować plik mapowania ProGuard. Informacje o tym, jak to zrobić, znajdziesz w witrynie Google Developers.

Kod natywny: generowanie pliku z symbolami na potrzeby debugowania

Wtyczka Androida do obsługi Gradle w wersji 4.1 lub nowszej

Jeśli w ramach projektu tworzysz pakiet Android App Bundle, możesz automatycznie uwzględnić w nim plik symboli debugowania. Aby uwzględnić ten plik, do pliku build.gradle dodaj ten ciąg:

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

Uwaga: plik z symbolami na potrzeby debugowania może mieć maksymalnie 300 MB. Jeśli plik jest za duży, zamiast wartości FULL użyj SYMBOL_TABLE. To pozwoli zmniejszyć jego rozmiar.

Jeśli w ramach projektu tworzysz plik APK, użyj ustawienia kompilacji build.gradle, by niezależnie wygenerować plik z symbolami na potrzeby debugowania. Prześlij ręcznie plik z symbolami debugowania do Konsoli Google Play zgodnie z instrukcjami w Kroku 2. (poniżej) Prześlij plik do odczytywania zaciemnionego kodu lub symbolizacji. W ramach procesu kompilacji wtyczka Androida do obsługi Gradle generuje ten plik w tej lokalizacji projektu:

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

Wtyczka Androida do obsługi Gradle w wersji 4.0 lub nowszej (i inne systemy kompilacji)

W ramach procesu kompilacji pakietu aplikacji lub pliku APK wtyczka Androida do obsługi Gradle przechowuje kopię niezmodyfikowanych bibliotek w katalogu projektu. Katalog ma strukturę podobną do tej:

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

Uwaga: jeśli używasz innego systemu kompilacji, możesz go zmodyfikować, by przechowywał niezmodyfikowane biblioteki w katalogu o wymaganej, podanej wyżej strukturze.

  1. Skompresuj zawartość tego katalogu:
    • $ cd app/build/intermediates/cmake/universal/release/obj
    • $ zip -r symbols.zip.
  2. Prześlij ręcznie plik symbols.zip do Konsoli Play zgodnie z instrukcjami podanymi poniżej w Kroku 2. Prześlij plik do odczytywania zaciemnionego kodu lub symbolizacji.

Rozmiar pliku symboli debugowania nie może przekraczać 300 MB. Jeśli plik jest za duży, prawdopodobnie pliki .so zawierają tabelę symboli (nazwy funkcji) oraz informacje na potrzeby debugowania w formacie DWARF (nazwy plików i wiersze kodu). Nie potrzebujesz ich do symbolizacji kodu. Możesz usunąć te informacje, korzystając z tego polecenia:

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

Uwaga: $OBJCOPY wskazuje określoną wersję interfejsu ABI, którą upraszczasz, np.: ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-objcopy

Krok 2. Prześlij plik do odczytywania zaciemnionego kodu lub symbolizacji

Aby usunąć zaciemnienie kodu lub przeprowadzić symbolizację danych o awariach i błędach ANR w konkretnej wersji aplikacji, musisz przesłać pliki do odczytywania zaciemnionego kodu lub symbolizacji dla każdej z wersji aplikacji.

Ważne: ten etap jest wymagany tylko w przypadku deweloperów korzystających z plików APK. Jeśli korzystasz z pakietu aplikacji i wtyczki Androida do obsługi Gradle w wersji 4.1 lub nowszej, nie musisz nic robić. Automatycznie pobierzemy plik do odczytywania zaciemnionego kodu z pakietu. Możesz przejść do Kroku 3. Wyświetl zrzuty stosu z usuniętym zaciemnieniem kodu w przypadku awarii. Więcej informacji o pakietach aplikacji znajdziesz na stronie Android Developers.

Przesyłanie plików za pomocą Konsoli Play

Aby przesłać plik do odczytywania zaciemnionego kodu lub symbolizacji:

  1. Otwórz Konsolę Play.
  2. Wybierz aplikację.
  3. W menu po lewej stronie kliknij Wersja > Eksplorator pakietów aplikacji.
  4. Za pomocą selektora w prawym górnym rogu wybierz odpowiedni artefakt.
  5. Kliknij kartę Pobrania i przewiń w dół do sekcji „Zasoby”.
  6. Kliknij strzałkę przesyłania pliku mapowania lub symboli na potrzeby debugowania, by przesłać pliki do odczytywania zaciemnionego kodu lub symbolizacji dla danej wersji aplikacji.
Przesyłanie plików za pomocą interfejsu Google Play Developer API

Aby przesłać pliki za pomocą interfejsu Google Play Developer API, otwórz witrynę Google Developers.

Krok 3. Wyświetl zrzut stosu z usuniętym zaciemnieniem kodu w przypadku awarii

Po przesłaniu pliku mapowania ProGuard lub pliku z symbolami na potrzeby debugowania dla danej wersji aplikacji nastąpi usunięcie zaciemnienia kodu z danymi o kolejnych awariach i błędach ANR w tej wersji. Zrzuty stosu z usuniętym zaciemnieniem kodu wygenerowane po każdej awarii lub po każdym błędzie ANR możesz przeglądać na stronie Awarie i błędy ANR dotyczącej aplikacji.

  1. Otwórz Konsolę Play.
  2. Wybierz aplikację.
  3. W menu po lewej stronie kliknij Jakość > Android Vitals > Awarie i błędy ANR.
  4. Wybierz awarię.
  5. W sekcji „Śledzenie stosu” pojawią się zrzuty stosu po symbolizacji i z usuniętym zaciemnieniem kodu.

Ważne: po przesłaniu pliku mapowania dla danej wersji aplikacji, zaciemnienie kodu zostanie usunięte wyłącznie w przyszłych awariach i błędach ANR w tej wersji. W przypadku wcześniejszych awarii i błędów ANR kod nie będzie miał usuniętego zaciemnienia.

Najczęstsze pytania

Nie chcę korzystać z usuwania zaciemnienia kodu ani symbolizacji w Konsoli Play. Czy mogę robić to offline?

Do symbolizacji zrzutów stosu w aplikacjach natywnych Konsola Play używa narzędzia ndk-stack, a w przypadku awarii wykonywania kodu Java – narzędzia ReTrace. Jeśli zdecydujesz się nie udostępniać plików do odczytywania zaciemnionego kodu, możesz skopiować zrzuty stosu awarii z zaciemnionym kodem z Konsoli Play i użyć odpowiedniego narzędzia offline, aby przeprowadzić ich symbolizację. Ten proces musisz przeprowadzić ręcznie dla każdego zrzutu stosu awarii, co zajmuje dużo czasu. Jeśli udostępnisz pliki do odczytywania zaciemnionego kodu, Konsola Play zajmie się tym za Ciebie.

Plik do odczytywania zaciemnionego kodu / symbolizacji został przesłany. Dlaczego dane o awariach i błędach ANR nadal mają zaciemniony kod?

Po przesłaniu pliku mapowania ProGuard lub pliku symboli debugowania dla danej wersji aplikacji zaciemnienie kodu będzie usuwane wyłącznie w przypadku przyszłych awarii i błędów ANR w tej wersji. Kod z usuniętym zaciemnieniem z nowych awarii i błędów ANR zgłaszanych z urządzeń użytkowników będzie widoczny w Konsoli Play po pewnym czasie. Zaczekaj chwilę.

Dlaczego po przesłaniu pliku do odczytywania zaciemnionego kodu / symbolizacji kod dotyczący moich awarii i błędów ANR jest tylko częściowo zaciemniony?

Dzieje się tak w przypadku przesłania niekompletnych plików. Pamiętaj, aby uwzględnić pliki symbolizacji dla całej aplikacji, zwłaszcza jeśli korzystasz ze złożonego lub wieloetapowego procesu kompilacji. Jedną z najczęstszych przyczyn częściowego usunięcia zaciemnionego kodu jest używanie bibliotek innej firmy. W takim przypadku spróbuj uzyskać plik do usuwania zaciemnionego kodu od dostawcy biblioteki.

Dlaczego po przesłaniu pliku do usuwania zaciemnionego kodu / symbolizacji widzę mniej awarii i błędów ANR, ale są one poważniejsze?

Bez plików do usuwania zaciemnienia kodu te same awarie i błędy ANR na urządzeniach 32-bitowych i 64-bitowych lub z procesorami ARM bądź Intel są wymieniane oddzielnie. Gdy udostępnisz pliki do odczytywania zaciemnionego kodu, możemy zgrupować te awarie i błędy razem, co daje Ci lepszy wgląd w problemy występujące w aplikacji.

Co się stanie, jeśli zapomnę przesłać plik?

Jeśli nie prześlesz pliku dla nowej wersji aplikacji, kod danych o awariach i błędach ANR znów zostanie zaciemniony. Aby przesłać taki plik, wykonaj instrukcje podane powyżej. Po przesłaniu pliku mapowania ProGuard lub pliku symboli debugowania dla danej wersji aplikacji zaciemnienie kodu będzie usuwane wyłącznie w przypadku przyszłych awarii i błędów ANR w tej wersji. Kod z usuniętym zaciemnieniem z nowych awarii i błędów ANR zgłaszanych z urządzeń użytkowników będzie widoczny w Konsoli Play dopiero po pewnym czasie.

Aby uchronić się przed pominięciem przesłania pliku, zmień proces kompilacji, by stosować w nim pakiety aplikacji z wtyczką Androida do obsługi Gradle w wersji 4.1 lub nowszej. Jeśli stosujesz ten proces, możesz automatycznie dodawać plik z symbolami na potrzeby debugowania do pakietu aplikacji, postępując według instrukcji w witrynie Android Developers.

Co się stanie, jeśli prześlę błędny plik?

Jeśli prześlesz zły plik dla danej wersji aplikacji, awarie i błędy ANR znów będą miały zaciemniony kod. Aby przesłać prawidłową wersję:

  1. Otwórz Konsolę Play.
  2. Wybierz aplikację.
  3. W menu po lewej stronie kliknij Wersja > Eksplorator pakietów aplikacji.
  4. Za pomocą selektora w prawym górnym rogu wybierz odpowiedni artefakt.
  5. Kliknij kartę Pobrania i przewiń w dół do sekcji „Zasoby”.
  6. Kliknij ikonę usuwania obok nieprawidłowego pliku do odczytywania zaciemnionego kodu lub symbolizacji.
  7. Potem kliknij ikonę przesyłania i wybierz prawidłowy plik dla danej wersji aplikacji.

Po przesłaniu prawidłowego pliku mapowania ProGuard lub pliku z symbolami na potrzeby debugowania dla danej wersji aplikacji zaciemnienie kodu będzie usuwane wyłącznie w przypadku przyszłych awarii i błędów ANR w tej wersji. Kod z usuniętym zaciemnieniem z nowych awarii i błędów ANR zgłaszanych z urządzeń użytkowników będzie widoczny w Konsoli Play dopiero po pewnym czasie.

Wskazówka: aby uchronić się przed przesłaniem nieprawidłowej wersji pliku, zmień proces kompilacji, by stosować w nim pakiety aplikacji z wtyczką Androida do obsługi Gradle w wersji 4.1 lub nowszej. W ten sposób możesz automatycznie dodawać plik z symbolami na potrzeby debugowania do pakietu aplikacji, zgodnie z instrukcją z witryny Android Developers.

Używam plików APK. Jak przejść na korzystanie z pakietów aplikacji?

Aby dowiedzieć się, jak to zrobić, przejdź do witryny Android Developers.

Moja aplikacja zawiera zarówno kod natywny, jak i kod Java. Czy mogę przesłać plik symbolizacji kodu natywnego i plik do odczytywania zaciemnionego kodu Java?

Tak.

Dlaczego w przypadku niektórych błędów ANR nie występują zrzuty stosu?

Zdarza się, że system napotyka błędy ANR, ale nie jest w stanie zebrać zrzutu stosu. W takiej sytuacji pokazujemy błąd ANR, bo zapewnia on pełniejszy obraz stabilności aplikacji, ale sam zrzut stosu nie może być wyświetlony. Błędy ANR bez zrzutów stosu są pogrupowane według typu i aktywności, więc przeglądanie i poprawianie podobnych błędów może pomóc w zmniejszeniu liczby tych bez zrzutów stosu.

Czy to było pomocne?
Jak możemy ją poprawić?

Potrzebujesz dodatkowej pomocy?

Zaloguj się i uzyskaj dodatkowe informacje, by szybko rozwiązać problem

Szukaj
Wyczyść wyszukiwanie
Zamknij wyszukiwanie
Aplikacje Google
Menu główne
Wyszukaj w Centrum pomocy
true
92637
false