Desofuscar o simbolitzar les traces de la pila de bloquejos

Aquest article està dirigit a usuaris de la nova versió beta de Play Console. Si cerques informació sobre la versió clàssica de Play Console, ves al menú Ajuda de la versió clàssica de Play Console.

Per obtenir més informació sobre la versió beta de Play Console, llegeix la nostra entrada de blog del llançament.

Els bloquejos i ANR d'Android produeixen una traça de la pila, que és una instantània de la seqüència de funcions imbricades que s'han cridat al programa fins al moment del bloqueig. Aquestes instantànies et poden ajudar a identificar i resoldre qualsevol problema de la font.

Si l'aplicació o el joc s'ha desenvolupat amb Java i utilitzes ProGuard per optimitzar i ofuscar els fitxers APK, pots penjar un fitxer de mapatge de ProGuard per a cada versió de l'aplicació a Play Console. Si l'aplicació o el joc s'ha desenvolupat amb un codi natiu, com ara C++, pots penjar un fitxer de símbols de depuració per a cada versió de l'aplicació que hi hagi a Play Console. Això facilita l'anàlisi i la correcció dels bloquejos i dels ANR.

Important: només s'admeten fitxers de mapatge compatibles amb ReTrace per desofuscar aplicacions compilades a Java. És el mateix format que utilitza ProGuard o R8.

Pas 1: genera un fitxer de desofuscament o de simbolització

Per desofuscar o simbolitzar els bloquejos i els ANR de l'aplicació, primer has de generar els fitxers necessaris per a la mateixa versió de l'aplicació. Has de generar i pujar un fitxer per a cada versió nova de l'aplicació perquè el desofuscament o la simbolització funcionin.

Java: genera un fitxer de mapatge de ProGuard

Per desofuscar traces de pila de Java, primer has de generar un fitxer de mapatge de ProGuard. Per obtenir informació sobre com pots fer-ho, ves al lloc web de Google Developers.

Natiu: genera un fitxer de símbols de depuració

Connector d'Android Gradle 4.1 i versions posteriors

Si el teu projecte crea un Android App Bundle, pots incloure-hi automàticament el fitxer de símbols de depuració. Per incloure-hi aquest fitxer, afegeix la línia següent al fitxer build.gradle de l'aplicació:

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

Nota: hi ha un límit de 300 MB per al fitxer de símbols de depuració. Si la petjada dels símbols de depuració és massa gran, utilitza SYMBOL_TABLE en lloc de FULL per reduir la mida del fitxer.

Si el teu projecte crea un APK, utilitza la configuració de compilació build.grade anterior per generar el fitxer de símbols de depuració per separat. Penja manualment el fitxer de símbols de depuració a Google Play Console, tal com es descriu a continuació al Pas 2: penja un fitxer de desofuscament o de simbolització. Com a part del procés de creació, el connector d'Android Gradle envia aquest fitxer a la ubicació de projecte següent:

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

Connector d'Android Gradle 4.0 i versions anteriors (i altres sistemes de compilació)

Com a part del procés de compilació d'un APK o un Android App Bundle, el connector d'Android Gradle conserva una còpia de les biblioteques sense desmuntar en un directori de projecte. Aquest directori té una estructura similar a aquesta:

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

Nota: si utilitzes un altre sistema de compilació, pots modificar-lo per emmagatzemar les biblioteques sense desmuntar en un directori amb l'estructura requerida que s'ha indicat més amunt.

  1. Comprimeix el contingut d'aquest directori:
    • $ cd app/build/intermediates/cmake/universal/release/obj
    • $ zip -r symbols.zip .
  2. Penja manualment el fitxer symbols.zip a Play Console, tal com es descriu a continuació al Pas 2: penja un fitxer de desofuscament o de simbolització.

El fitxer de símbols de depuració té un límit de 300 MB. Si el fitxer és massa gran, probablement és perquè els fitxers .so contenen una taula de símbols (noms de funcions) i també informació de depuració de DWARF (noms de fitxers i línies de codi). Aquests elements no són necessaris per simbolitzar el codi i pots suprimir-los executant aquesta ordre:

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

Nota: $OBJCOPY apunta a la versió específica de l'ABI que estàs suprimint, per exemple:ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-objcopy

Pas 2: penja un fitxer de desofuscament o de simbolització

Per desofuscar o simbolitzar els bloquejos i ANR d'una versió de l'aplicació, has de penjar els fitxers de desofuscament o de simbolització de cada versió de l'aplicació.

Important: aquest pas només és obligatori per als desenvolupadors que utilitzen APK. Si fas servir un Android App Bundle i un connector d'Android Gradle 4.1 o versions posteriors, no cal que facis res. Agafarem automàticament el fitxer de desofuscament del paquet i podràs passar al Pas 3: consulta les traces de la pila de bloquejos desofuscades. Pots obtenir més informació sobre els app bundles al lloc web de desenvolupadors d'Android.

Penjar fitxers amb Play Console

Per penjar un fitxer de desofuscament o de simbolització:

  1. Obre Play Console.
  2. Selecciona una aplicació.
  3. Al menú de l'esquerra, selecciona Versió > Dispositius i versions > Explorador de l'app bundle.
  4. Amb el selector de l'extrem superior dret, tria l'artefacte rellevant.
  5. Selecciona la pestanya Baixades i desplaça't cap avall fins a la secció "Recursos".
  6. Fes clic a la fletxa de pujada del fitxer de mapatge o als símbols de depuració segons correspongui per penjar el fitxer de desofuscament o de simbolització de la versió de l'aplicació.
Penjar fitxers mitjançant l'API Developer de Google Play

Per penjar fitxers mitjançant l'API Developer de Google Play, ves al lloc web Google Developers.

Pas 3: consulta les traces de la pila de bloquejos desofuscades

Després de penjar un fitxer de mapatge de ProGuard o un fitxer de símbols de depuració per a una versió de l'aplicació, els bloquejos i els ANR que es produeixin posteriorment es desofuscaran. A la pàgina Bloquejos i ANR de l'aplicació, pots consultar les traces de la pila que s'hi hagin desofuscat per a bloquejos i ANR individuals.

  1. Obre Play Console.
  2. Selecciona una aplicació.
  3. Al menú de l'esquerra, selecciona Qualitat > Android vitals > Bloquejos i ANR.
  4. Selecciona un bloqueig.
  5. A la secció "Traces de la pila", veuràs les teves traces de la pila que s'hagin desofuscat o simbolitzat.

Important: després de penjar un fitxer de mapatge d'una versió de l'aplicació, només es desofuscaran els bloquejos i els ANR que es produeixin amb posterioritat. Els bloquejos i ANR d'una versió de l'aplicació que es produeixin abans de penjar el fitxer de mapatge corresponent no es desofuscaran.

Preguntes freqüents

No vull utilitzar el desofuscament o la simbolització de Play Console. Puc fer-ho sense connexió?

Play Console utilitza ndk-stack per simbolitzar les traces de la pila en aplicacions natives i ReTrace per als bloquejos de Java. Si decideixes no compartir els fitxers de desofuscament, pots copiar les piles de bloquejos ofuscades de Play Console i utilitzar l'eina adequada sense connexió per simbolitzar-les. Tanmateix, aquest procés s'ha de fer manualment per a cada pila de bloquejos i, per tant, és lent i requereix molt de temps. Si proporciones els fitxers de desofuscament, Play Console durà a terme aquesta tasca.

He penjat el fitxer de desofuscament o de simbolització. Per què encara estan ofuscats els meus bloquejos i ANR?

Després de penjar un fitxer de mapatge de ProGuard o un fitxer de símbols de depuració d'una versió de l'aplicació, només es desofuscaran els bloquejos i ANR que es produeixin amb posterioritat. Hauràs de permetre que els dispositius dels usuaris informin de bloquejos i ANR nous per poder veure els bloquejos i ANR desofuscats a Play Console.

Per què els meus bloquejos i ANR només es desofusquen parcialment després de penjar el fitxer de desofuscament o de simbolització?

Això passa perquè s'ha penjat un fitxer de desofuscament o de simbolització incomplet. Assegura't d'incloure els fitxers de simbolització de tota l'aplicació, especialment si fas servir un procés de compilació complex o multifàsic. Una de les raons més habituals per les quals es desofusca parcialment és l'ús d'una biblioteca de tercers. En aquest cas, és possible que puguis obtenir els fitxers de desofuscament del proveïdor de la biblioteca.

Després de penjar el fitxer de desofuscament o de simbolització, per què sembla que obtinc menys ANR i bloquejos, però més greus?

Sense fitxers de desofuscament, el mateix bloqueig o ANR en un dispositiu de 32 i de 64 bits, o en un dispositiu ARM i Intel, es mostra per separat. En proporcionar fitxers de desofuscament, podem agrupar aquests bloquejos i oferir-te una perspectiva més completa dels bloquejos i ANR més impactants de la teva aplicació.

Què passa si m'oblido de penjar el fitxer?

Si t'oblides de penjar el fitxer d'una versió nova de l'aplicació, els bloquejos i ANR es tornaran a ofuscar. Segueix les instruccions anteriors per penjar-lo ara. Després de penjar un fitxer de mapatge de ProGuard o un fitxer de símbols de depuració d'una versió de l'aplicació, només es desofuscaran els bloquejos i ANR que es produeixin amb posterioritat. Hauràs de deixar passar un temps perquè els dispositius dels usuaris informin de bloquejos i ANR nous, i per poder veure els bloquejos i ANR desofuscats a la consola.

Per evitar el risc d'oblidar-te de penjar el fitxer, et recomanem que canviïs el procés de compilació per utilitzar app bundles amb el connector d'Android Gradle 4.1 o versions posteriors. En aquest cas, pots incloure automàticament el fitxer de símbols de depuració a l'app bundle seguint les instruccions del lloc web de desenvolupadors d'Android.

Què passa si penjo un fitxer incorrecte?

Si penges un fitxer incorrecte per a una versió de l'aplicació, els bloquejos i ANR es tornaran a ofuscar. Per penjar una versió corregida:

  1. Obre Play Console.
  2. Selecciona una aplicació.
  3. Al menú de l'esquerra, selecciona Versió > Dispositius i versions > Explorador de l'app bundle.
  4. Amb el selector de l'extrem superior dret, tria l'artefacte rellevant.
  5. Selecciona la pestanya Baixades i desplaça't cap avall fins a la secció "Recursos".
  6. Fes clic a la icona de supressió que hi ha al costat del fitxer de desofuscament o de simbolització incorrecte.
  7. Un cop suprimida la versió incorrecta, fes clic a la icona de pujada i penja el fitxer correcte per a la versió de l'aplicació.

Després de penjar el fitxer de mapatge de ProGuard o de depuració correcte d'una versió de l'aplicació, només es desofuscaran els bloquejos i ANR que es produeixin amb posterioritat. Hauràs de deixar passar un temps perquè els dispositius dels usuaris informin de bloquejos i ANR nous, i per poder veure els bloquejos i ANR desofuscats a la consola.

Consell: per evitar el risc de penjar una versió incorrecta del fitxer, et recomanem que canviïs el procés de compilació per utilitzar app bundles amb el connector d'Android Gradle 4.1 o versions posteriors. En aquest cas, pots incloure automàticament el fitxer de símbols de depuració a l'app bundle seguint les instruccions del lloc web de desenvolupadors d'Android.

Actualment utilitzo APK. Com puc canviar i utilitzar app bundles?

Visita el lloc web de desenvolupadors d'Android per començar.

La meva aplicació conté codi natiu i Java. Puc carregar tant un fitxer de simbolització nativa com un fitxer de desofuscament de Java?

Sí.

Ha estat útil?
Com ho podem millorar?

Necessites més ajuda?

Inicia la sessió per obtenir opcions d'assistència addicionals que et permetin resoldre el problema ràpidament