Depurar código da plataforma

O Android Studio for Platform (ASfP) integra a depuração de plataforma multilíngue na guia Anexar da janela de ferramentas Depurar:

  • Selecione Run > Attach to Android Process (Control+Alt+A) para anexar o depurador Java, o depurador nativo (LLDB agrupado) ou ambos a qualquer app ou processo do sistema em execução em um dispositivo físico ou virtual Cuttlefish.
  • Inspecione todas as bibliotecas compartilhadas carregadas (.so) e o ID do build ELF de oito caracteres no painel Bibliotecas antes de anexar. Os ícones de marca de seleção verificam os símbolos de depuração locais correspondentes em out/target/product/<device>/symbols.
  • Gerencie os pré-requisitos do dispositivo na barra de ferramentas: filtre com Mostrar processos do sistema, clique em Dispositivo com acesso root para executar adb root (mostrando O dispositivo tem acesso root quando ativo) e clique em Ativar JDWP para ativar o JDWP em builds userdebug.
  • Defina pontos de interrupção condicionais e de exceção, confira valores de variáveis inline no editor, use Soltar frame e Depurar passo a passo inteligente e inspecione tipos estruturados de C++ e Rust no tempo de execução.

Antes de usar o depurador, crie o destino lunch para que o índice de símbolos out/target/product/<device>/symbols/.build-id local exista e faça o flash ou inicie uma imagem de dispositivo correspondente.

Depuração dupla de Java e nativa

Para depurar um aplicativo Java ou Kotlin, um app do sistema (como com.android.messaging, Configurações ou SystemUI) ou um processo que chama código JNI e C++ ou Rust, siga estas etapas:

  1. Defina pontos de interrupção nos arquivos de origem Java, Kotlin, C, C++ ou Rust.
  2. Selecione Run > Attach to Android Process (Control+Alt+A). O ASfP abre uma guia Anexar fixada na janela de ferramentas Depurar.
  3. Selecione o dispositivo de destino no menu suspenso. Se o JDWP não estiver ativado em um build userdebug, clique em Ativar JDWP. O ASfP define persist.debug.dalvik.vm.jdwp.enabled=1 e reinicia o dispositivo. Quando ativo, o botão mostra JDWP enabled com uma ação de clique com o botão direito do mouse Disable JDWP.
  4. Selecione o processo de destino na tabela. Os processos Java e ART mostram um ícone de xícara de café.
  5. Na parte de baixo da guia Anexar, selecione Depurador Java, Depurador nativo ou ambos. Ao selecionar os dois, duas guias vinculadas são abertas na janela de ferramentas Debug: <process> (<pid>) para LLDB integrado e <process> (<pid>)-jdwp para Java. Os ciclos de vida estão vinculados, então interromper uma sessão interrompe as duas.
  6. Clique em Anexar e interaja com o app no dispositivo para atingir os pontos de interrupção.

Guias de depuração nativa e Java duplas vinculadas à guia &quot;Anexar&quot;

Depuração de processos do sistema (C e C++) e verificação de símbolos

Para depurar daemons do sistema, HALs ou serviços do sistema (como android.hardware.bluetooth-service.cuttlefish, surfaceflinger ou audioserver), siga estas etapas:

  1. Abra Executar > Anexar ao processo do Android (Control+Alt+A). Se a barra de ferramentas mostrar Root Device, clique nela para que o ASfP execute adb root e mostre Device is rooted.
  2. Selecione Mostrar processos do sistema na barra de ferramentas superior e filtre o processo de destino.
  3. Verifique os símbolos de depuração locais no painel "Bibliotecas": ao selecionar um processo, a tabela Bibliotecas é preenchida com todas as bibliotecas compartilhadas ELF (.so) carregadas no processo e os oito primeiros caracteres hexadecimais do ID de build do ELF. O ASfP compara cada ID de build com out/target/product/<device>/symbols (symbols/.build-id é necessário para resolver bibliotecas dentro de APEXes):
    • As bibliotecas verificadas mostram um ícone de verificação. Aponte para qualquer linha resolvida para visualizar o caminho completo do símbolo local .debug.
    • As bibliotecas não resolvidas sem símbolos locais correspondentes mostram um ícone de aviso.
  4. Detecção de processos não Java: quando você seleciona um processo C++ ou Rust (marcado com um ícone de hexágono C), o ASfP oculta o depurador Java e mostra A depuração Java não está disponível, não é um processo Java., mantendo o depurador nativo marcado.
  5. Defina pontos de interrupção nos arquivos de origem C, C++ ou Rust, clique em Anexar e acionar o caminho do código no dispositivo.

Anexar guia mostrando a tabela de bibliotecas, IDs de build ELF e marcas de seleção de símbolos locais

Depurar código Rust

O ASfP depura o código da plataforma Rust com o mesmo depurador LLDB integrado usado para C e C++. Não é necessário um adaptador externo nem uma configuração manual do servidor: o ASfP usa lldb-dap do conjunto de ferramentas agrupado e carrega automaticamente os pretty-printers do Rust dos pré-compilados do AOSP para que tipos padrão como String, Vec, HashMap e Option mostrem valores estruturados no painel Variáveis.

Anexar a um processo Rust em execução em um dispositivo

Siga as etapas em Depuração de processos do sistema (C e C++): abra Executar > Anexar ao processo do Android, verifique se O dispositivo está com acesso root e se os símbolos locais mostram uma marca de seleção no painel Bibliotecas, mantenha Depurador nativo marcado e clique em Anexar. Os frames de pilha Rust e C ou C++ aparecem juntos na mesma sessão de depuração.

Depurar um módulo rust_test ou rust_test_host

  1. Abra o arquivo Android.bp declarando uma meta rust_test ou rust_test_host e clique no ícone Executar na barra ao lado do tipo de módulo.
  2. Selecione Debug '<ModuleName>'. O ASfP cria o destino, inicia o binário de teste no LLDB na máquina host ou no dispositivo conectado e faz uma pausa nos pontos de interrupção do Rust.
  3. Para depurar uma única função de teste ou personalizar comandos de inicialização do LLDB, abra Run > Edit Configurations, selecione a configuração Soong Test gerada e defina Method ou expanda as opções do Debugger. Para mais informações sobre as opções de configuração do Soong Test, consulte Testar o código da plataforma com o atest.

Depuração de código da plataforma Rust com visualizadores de variáveis estruturadas no ASfP