Deobfuskace nebo symbolikace trasování zásobníku při selhání

Selhání a chyby ANR v systému Android generují trasování zásobníku, což je snímek posloupnosti vnořených funkcí, které program volal až do okamžiku selhání. Tyto snímky vám mohou pomoci identifikovat a opravit případné problémy ve zdroji.

Pokud byla aplikace nebo hra napsána v jazyce Java a používáte k optimalizaci a obfuskaci aplikace nástroj ProGuard, můžete v Play Console pro každou verzi aplikace nahrát mapovací soubor nástroje ProGuard. Pokud byla aplikace nebo hra napsána v nativním kódu, například v C++, můžete v Play Console pro každou verzi nahrát soubor s ladicími symboly. Usnadňuje to analýzu a opravu selhání a chyb ANR.

Důležité: U aplikací zkompilovaných v jazyce Java jsou podporovány jen deobfuskační soubory kompatibilní s nástrojem ReTrace. Jedná se o stejný formát, jaký používají programy ProGuard a R8.

Krok 1: Vygenerování deobfuskačního či symbolikačního souboru

Pokud chcete deobfuskovat nebo symbolikovat selhání a chyby ANR konkrétní verze aplikace, nejdříve pro ni musíte vytvořit potřebné soubory. Pro každou novou verzi aplikace je potřeba vygenerovat a nahrát nový soubor, jinak u ní deobfuskace a symbolikace nebude fungovat.

Java: Vygenerování mapovacího souboru ProGuard

Chcete-li deobfuskovat trasování zásobníku jazyka Java, nejdříve musíte vygenerovat mapovací soubor ProGuard. Pokyny najdete na webu Google Developers.

Nativní kód: Vygenerování souboru se symboly pro ladění

Plugin Android Gradle verze 4.1 nebo novější

Pokud váš projekt vytváří balíček Android App Bundle, můžete do něj automaticky zahrnout soubor s ladicími symboly. Chcete-li jej zahrnout, přidejte do souboru build.gradle aplikace následující řádek:

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

Poznámka: Limit pro soubor ladicích symbolů je 800 MB. Pokud je příliš velký, zmenšete ho tím, že namísto možnosti FULL použijete možnost SYMBOL_TABLE.

Pokud váš projekt vytváří soubor APK, pomocí výše uvedeného nastavení build.gradle vygenerujte samostatný soubor s ladicími symboly. Soubor s ladicími symboly ručně nahrajte do služby Google Play Console podle pokynů v sekci Krok 2: Nahrání deobfuskačního či symbolikačního souboru. Plugin Android Gradle tento soubor při procesu sestavení v projektu vygeneruje v následujícím umístění:

  • app/build/outputs/native-debug-symbols/název-varianty/native-debug-symbols.zip

Plugin Android Gradle verze 4.0 a starší (a jiné sestavovací systémy)

V rámci procesu sestavení balíčku APK nebo App Bundle uchovává plugin Android Gradle v adresáři projektu kopie knihoven bez odstraněných ladicích údajů. Tento adresář má strukturu podobnou této:

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

Poznámka: Pokud používáte jiný sestavovací systém, můžete ho upravit tak, aby ukládal knihovny bez odstraněných ladicích údajů do adresáře s výše uvedenou požadovanou strukturou.

  1. Obsah tohoto adresáře zazipujte.
    • $ cd app/build/intermediates/cmake/universal/release/obj
    • $ zip -r symbols.zip .
  2. Soubor symbols.zip ručně nahrajte do Play Console podle pokynů níže v sekci Krok 2: Nahrání deobfuskačního či symbolikačního souboru.

Soubor ladicích symbolů je omezen na 800 MB. Pokud je příliš velký, pravděpodobně je to proto, že soubory .so obsahují tabulku symbolů (názvů funkcí) a také ladicí údaje DWARF (názvy souborů a řádky kódu). Tyto informace k symbolikaci kódu nejsou potřeba a lze je odstranit tímto příkazem:

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

Poznámka: $OBJCOPY odkazuje na konkrétní verzi rozhraní ABI, ze které chcete odstranit ladicí údaje, například: ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-objcopy

Krok 2: Nahrání deobfuskačního či symbolikačního souboru

Chcete-li u konkrétní verze aplikace deobfuskovat či symbolikovat selhání a chyby ANR, musíte pro ni nahrát deobfuskační či symbolikační soubor.

Důležité: Tento krok je nutný pouze u vývojářů, kteří používají soubory APK. Pokud používáte balíček App Bundle a plugin Android Gradle verze 4.1 nebo novější, nemusíte nic dělat – deobfuskační soubor získáme automaticky z balíčku. Můžete přejít ke kroku 3: Zobrazení deobfuskovaných trasování zásobníku při selhání. Další informace o balíčcích App Bundle najdete na webu Android Developers.

Nahrání souborů pomocí služby Play Console

Postup nahrání deobfuskačního či symbolikačního souboru:

  1. Otevřete Play Console.
  2. Vyberte aplikaci.
  3. V nabídce vlevo vyberte Vydání > Průzkumník balíčků aplikací.
  4. Pomocí nástroje pro výběr v pravém horním rohu vyberte odpovídající artefakt.
  5. Vyberte kartu Stažení a přejděte dolů do sekce Položky.
  6. Klikněte na šipku k nahrání mapovacího souboru nebo ladicích symbolů a nahrajte pro danou verzi aplikace deobfuskační nebo symbolikační soubor.
Nahrání souborů pomocí rozhraní Google Play Developer API

Chcete-li nahrát soubory pomocí rozhraní Google Play Developer API, přejděte na web Google Developers.

Krok 3: Zobrazení deobfuskovaných trasování zásobníku při selhání

Jakmile pro verzi aplikace nahrajete mapovací soubor ProGuard nebo soubor s ladicími symboly, její další selhání a chyby ANR budou deobfuskovány. Deobfuskovaná trasování zásobníku pro jednotlivá selhání a chyby ANR si můžete prohlédnout na stránce Selhání a chyby ANR aplikace.

  1. Otevřete Play Console.
  2. Vyberte aplikaci.
  3. V nabídce vlevo vyberte Kvalita > Android vitals > Selhání a chyby ANR.
  4. Vyberte selhání.
  5. V sekci Trasování zásobníku uvidíte deobfuskovaná a symbolikovaná trasování zásobníku.

Důležité: Když pro verzi aplikace nahrajete mapovací soubor, budou u ní deobfuskována pouze budoucí selhání a chyby ANR. Selhání a chyby ANR z doby před nahráním mapovacího souboru deobfuskovány nebudou.

Časté dotazy

Nechci používat deobfuskaci/symbolikaci v Play Console. Můžu ji provést offline?

K symbolikaci trasování nativních aplikací používá Play Console nástroj ndk-stack. Pro selhání aplikací v jazyce Java používá nástroj ReTrace. Pokud deobfuskační soubory nechcete sdílet, můžete si z Play Console zkopírovat obfuskovaná trasování zásobníku a použít vhodný nástroj k symbolikaci. Tento proces je však pro každé trasování zásobníku potřeba provést ručně, a je proto pomalý a časově náročný. Pokud službě Play Console poskytnete deobfuskační soubory, provede ho za vás.

Nahrál(a) jsem soubor k deobfuskaci/symbolikaci, tak proč jsou selhání a chyby ANR stále obfuskované?

Po nahrání mapovacího souboru ProGuard nebo souboru s ladicími symboly pro konkrétní verzi aplikace budou deobfuskována pouze její následná selhání a chyby ANR. Deofuskovaná selhání a chyby ANR budou v Play Console k dispozici až poté, co zařízení uživatelů nahlásí nová selhání a chyby ANR.

Proč jsou po nahrání souboru k deobfuskaci/symbolikaci selhání a chyby ANR deobfuskovány jen částečně?

Důvodem je neúplný deobfuskační/symbolikační soubor. Dejte pozor, abyste nahráli symbolikační soubory pro celou aplikaci – zejména pokud používáte několikafázový proces sestavení. Jedním z nejčastějších důvodů pouze částečné deobfuskace je použití knihovny třetí strany. Je možné, že se vám podaří získat deobfuskační soubory od poskytovatele knihovny.

Zdá se mi, že po nahrání deobfuskačního/symbolikačního souboru dochází k selháním a chybám ANR méně často, ale jsou závažnější. Je to možné?

Bez deobfuskačních souborů se stejné selhání nebo chyba ANR na 32bitovém nebo 64bitovém zařízení nebo na zařízení s procesorem ARM či Intel zobrazuje samostatně. Po dodání deobfuskačních souborů můžeme tato selhání seskupit dohromady a poskytnout vám tak lepší informace o tom, která selhání a chyby ANR mají na aplikaci největší dopad.

Co se stane, když tento soubor zapomenu nahrát?

Pokud tento soubor pro novou verzi aplikace nenahrajete, selhání a chyby ANR budou opět obfuskované. Můžete ho nahrát teď podle pokynů výše. Po nahrání mapovacího souboru ProGuard nebo souboru s ladicími symboly pro konkrétní verzi aplikace budou deobfuskována pouze její následná selhání a chyby ANR. Deofuskovaná selhání a chyby ANR budou v Play Console k dispozici až poté, co zařízení uživatelů nahlásí nová selhání a chyby ANR.

Chcete-li předejít riziku, že byste na nahrání souboru zapomněli, zvažte možnost změnit proces sestavení a přejít na balíčky App Bundle s pluginem Android Gradle verze 4.1 nebo novější. Soubor s ladicími symboly tak do balíčku aplikace budete moci zahrnout automaticky. Pokyny najdete na webu Android Developers.

Co se stane, když nahraju nesprávný soubor?

Pokud pro verzi aplikace nahrajete nesprávný soubor, budou selhání a chyby ANR opět obfuskovány. Postup nahrání opravené verze:

  1. Otevřete Play Console.
  2. Vyberte aplikaci.
  3. V nabídce vlevo vyberte Vydání > Průzkumník balíčků aplikací.
  4. Pomocí nástroje pro výběr v pravém horním rohu vyberte odpovídající artefakt.
  5. Vyberte kartu Stažení a přejděte dolů do sekce Položky.
  6. Klikněte na ikonu smazání vedle nesprávného deobfuskačního či symbolikačního souboru.
  7. Po smazání nesprávné verze klikněte na ikonu nahrání a nahrajte pro danou pro verzi aplikace správný soubor.

Po nahrání mapovacího souboru ProGuard nebo souboru s ladicími symboly pro příslušnou verzi aplikace budou deobfuskována pouze následná selhání a chyby ANR. Deofuskovaná selhání a chyby ANR budou v Play Console k dispozici až poté, co zařízení uživatelů nahlásí nová selhání a chyby ANR.

Tip: Pokud chcete předejít riziku nahrání nesprávné verze souboru, zvažte možnost změnit proces sestavení a přejít na balíčky App Bundle s pluginem Android Gradle verze 4.1 nebo novější. Soubor s ladicími symboly tak do balíčku aplikace budete moci zahrnout automaticky. Pokyny najdete na webu Android Developers.

Používám soubory APK. Jak přejdu na balíčky App Bundle?

Přečtěte si pokyny na webu Android Developers.

Moje aplikace obsahuje nativní kód i kód v jazyce Java. Můžu nahrát symbolikační soubor pro nativní kód i deobfuskační soubor pro kód v jazyce Java?

Ano.

Proč u některých chyb ANR není uvedeno trasování zásobníku?

Někdy se stane, že systém narazí na chybu ANR, ale trasování zásobníku nedokáže shromáždit. V takovém případě se zobrazí chyba ANR, abyste měli ucelenou představu o stabilitě aplikace, ale trasování zásobníku k dispozici není. Chyby ANR bez trasování zásobníku jsou seskupeny podle typu a aktivity, a tak vám kontrola a oprava podobných chyb ANR může pomoci snížit počet chyb bez trasování zásobníku.

Pomohly vám tyto informace?

Jak bychom článek mohli vylepšit?

Potřebujete další pomoc?

Vyzkoušejte tyto další kroky:

Vyhledávání
Vymazat vyhledávání
Zavřít vyhledávání
Hlavní nabídka
16165119836258614877
true
Prohledat Centrum nápovědy
true
true
true
true
true
92637
false
false