Depurar APKs pré-compilado

O Android Studio 3.0 e versões mais recentes permite que você crie perfis e depure APKs sem precisar criá-los usando um projeto do Android Studio. No entanto, você precisa garantir que está usando um APK com depuração ativada.

Para iniciar a depuração de um APK, clique em Profile or debug APK na tela de boas-vindas do Android Studio. Ou, se já tiver um projeto aberto, clique em File > Profile or Debug APK na barra de menus. Na caixa de diálogo seguinte, selecione o APK que você quer importar para o Android Studio e clique em OK.

Com isso, o Android Studio exibe os arquivos APK descompactados, como na Figura 1. Esse não é um conjunto de arquivos totalmente descompactado, apesar de oferecer arquivos .smali para uma versão mais legível dos arquivos .dex.

Figura 1. Importação de um APK pré-compilado para o Android Studio.

A visualização Android no painel "Project" permite que você inspecione o seguinte conteúdo do seu APK:

  • APK file: clicar duas vezes no APK abre o APK Analyzer.
  • manifests: contém os manifestos de apps extraídos do APK.
  • java: contém o código Kotlin/Java que o Android Studio separa (em arquivos .smali) dos arquivos DEX do seu APK. Cada arquivo .smali nesse diretório corresponde a uma classe Kotlin/Java.
  • cpp: se o app incluir código nativo, esse diretório conterá as bibliotecas nativas do seu APK (arquivos .so).
  • External Libraries: contém o SDK do Android.

Você pode usar o Android Profiler imediatamente para começar a testar o desempenho do seu app.

Para depurar o código Kotlin/Java do seu app, é necessário anexar origens Kotlin/Java e adicionar pontos de interrupção nos arquivos .kt/.java. Da mesma forma, para depurar seu código nativo, é necessário anexar símbolos de depuração nativos.

Anexar origens Kotlin/Java

Por padrão, o Android Studio extrai o código Kotlin/Java do seu APK e o salva como arquivos .smali. Para depurar o código Kotlin/Java usando pontos de interrupção, aponte o ambiente de desenvolvimento integrado para os arquivos de origem .kt ou .java que correspondem aos arquivos .smali que você quer depurar.

Para anexar origens Kotlin/Java, proceda da seguinte forma:

  1. Clique duas vezes em um arquivo .smali do painel Project, usando a visualização Android. Depois de abrir o arquivo, o editor exibe um banner pedindo para você selecionar as origens Kotlin/Java:

Anexar banner de origens

  1. Clique em Attach Kotlin/Java Sources no banner, na parte superior da janela do editor.
  2. Navegue até o diretório com os arquivos de origem Kotlin/Java do app e clique em Open.

Na janela Project, o ambiente de desenvolvimento integrado substitui os arquivos .smali pelos .kt ou .java correspondentes. O ambiente de desenvolvimento integrado também inclui classes internas automaticamente. Agora é possível adicionar pontos de interrupção e depurar o app normalmente.

Anexar símbolos de depuração nativos

Se o APK incluir bibliotecas nativas (arquivos .so) sem símbolos de depuração, o ambiente de desenvolvimento integrado mostrará um banner semelhante ao da Figura 1. Não é possível depurar o código nativo do APK ou usar pontos de interrupção sem anexar bibliotecas nativas depuráveis.

Se você criar as bibliotecas nativas no seu APK com um ID de compilação, o Android Studio verificará se o ID nos arquivos de símbolo é igual ao ID nas bibliotecas nativas e rejeitará os arquivos de símbolo se não houver correspondência. Se você não usar um ID de compilação, fornecer arquivos de símbolo incorretos poderá causar problemas na depuração.

Para anexar bibliotecas nativas depuráveis, faça o seguinte:

  1. Faça o download do NDK e das ferramentas, caso ainda não tenha feito.
  2. No diretório cpp da janela Project, visível apenas se você tiver selecionado a visualização Android (Figura 2), clique duas vezes sobre um arquivo de biblioteca nativa que não inclua símbolos de depuração. O editor mostra uma tabela de todos os ABIs compatíveis com seu APK.
  3. Clique em Add no canto superior direito da janela do editor.
  4. Navegue até o diretório que tem as bibliotecas nativas depuráveis que você quer anexar e clique em OK.

Se o APK e as bibliotecas nativas depuráveis tiverem sido criados usando uma estação de trabalho diferente, você também precisará especificar caminhos para os símbolos de depuração locais seguindo estas etapas:

  1. Adicione caminhos locais para os símbolos de depuração ausentes editando o campo na coluna Local Paths da seção Path Mappings na janela do editor, conforme mostrado na Figura 2. Na maioria dos casos, basta fornecer o caminho para uma pasta raiz, e o Android Studio inspecionará automaticamente os subdiretórios para mapear outras origens. O ambiente de desenvolvimento integrado também mapeia automaticamente caminhos para um NDK remoto no seu download local do NDK.
  2. Clique em Apply Changes na seção Path Mappings da janela do editor.

Figura 2. Fornecimento de caminhos para os símbolos locais de depuração.

Os arquivos de origem nativos serão exibidos na janela Project. Abra esses arquivos nativos para adicionar pontos de interrupção e depurar seu app normalmente. Também é possível remover os mapeamentos clicando em Clear na seção Path Mappings da janela do editor.

Problema conhecido: ao anexar símbolos de depuração a um APK, o APK e os arquivos .so depuráveis precisarão ser criados usando a mesma estação de trabalho ou servidor de compilação.

No Android Studio 3.6 e versões mais recentes, não é mais necessário criar um novo projeto quando o APK é atualizado fora do ambiente de desenvolvimento integrado. O Android Studio detecta mudanças no APK e oferece a opção de importá-lo novamente.

Figura 3. APKs atualizados fora do Android Studio podem ser importados novamente.