Debugowanie kodu platformy

Android Studio for Platform (ASfP) integruje debugowanie platformy w wielu językach na karcie Dołącz w oknie narzędziowym Debugowanie:

  • Wybierz Uruchom > Dołącz do procesu Androida (Control+Alt+A), aby dołączyć debugger Javy, debugger natywny (dołączony LLDB) lub oba te debuggery do dowolnej uruchomionej aplikacji lub procesu systemowego na urządzeniu fizycznym lub wirtualnym urządzeniu Cuttlefish.
  • Sprawdź każdą wczytaną bibliotekę współdzieloną (.so) i jej 8-znakowy identyfikator ELF Build ID w panelu Biblioteki przed dołączeniem – ikony z zaznaczeniem potwierdzają dopasowanie lokalnych symboli debugowania w sekcji out/target/product/<device>/symbols.
  • Zarządzaj wymaganiami wstępnymi dotyczącymi urządzenia na pasku narzędzi: filtruj za pomocą opcji Pokaż procesy systemowe, kliknij Urządzenie z dostępem do roota, aby uruchomić adb root (gdy ta opcja jest aktywna, wyświetla się komunikat Urządzenie ma dostęp do roota), i kliknij Włącz JDWP, aby włączyć JDWP w kompilacjach userdebug.
  • Ustawiaj warunkowe i wyjątkowe punkty przerwania, wyświetlaj w edytorze wartości zmiennych wbudowanych, korzystaj z funkcji Drop Frame i inteligentnego Step Into oraz sprawdzaj w czasie działania programu strukturalne typy C++ i Rust.

Przed użyciem debugera skompiluj lunchelement docelowy, aby istniał lokalnyout/target/product/<device>/symbols/.build-id indeks symboli, a następnie wgraj lub uruchom pasujący obraz urządzenia.

Debugowanie w Javie oraz debugowanie w Javie i w kodzie natywnym

Aby debugować aplikację w Javie lub Kotlinie, aplikację systemową (np. com.android.messaging, Ustawienia lub SystemUI) albo proces wywołujący kod JNI, C++ lub Rust, wykonaj te czynności:

  1. Ustawiaj punkty przerwania w plikach źródłowych w językach Java, Kotlin, C, C++ lub Rust.
  2. Wybierz Uruchom > Dołącz do procesu Androida (Ctrl+Alt+A). ASfP otwiera przypiętą kartę Dołącz w oknie narzędzia Debugowanie.
  3. Wybierz urządzenie docelowe z menu. Jeśli JDWP nie jest włączony w przypadku kompilacji userdebug, kliknij Włącz JDWP – ASfP ustawia persist.debug.dalvik.vm.jdwp.enabled=1 i ponownie uruchamia urządzenie. Gdy jest aktywny, przycisk wyświetla komunikat JDWP włączony z działaniem Wyłącz JDWP po kliknięciu prawym przyciskiem myszy.
  4. Wybierz z tabeli proces docelowy (procesy Java i ART są oznaczone ikoną filiżanki kawy).
  5. U dołu karty Załącz wybierz Debuger Java, Debuger natywny lub obie te opcje. Wybranie obu opcji spowoduje otwarcie 2 połączonych kart w oknie narzędziowym Debug: <process> (<pid>) wbudowanego debugera LLDB i <process> (<pid>)-jdwp debugera Java. Ich cykle życia są ze sobą powiązane, więc zatrzymanie jednej sesji powoduje zatrzymanie obu.
  6. Kliknij Dołącz i korzystaj z aplikacji na urządzeniu, aby osiągnąć punkty przerwania.

Karty podwójnego debugowania kodu Java i natywnego połączone z kartą Dołącz

Debugowanie procesów systemowych (C i C++) i weryfikacja symboli

Aby debugować demony systemowe, HAL-e lub usługi systemowe (np.android.hardware.bluetooth-service.cuttlefish, surfaceflinger lubaudioserver), wykonaj te czynności:

  1. Otwórz Uruchom > Dołącz do procesu Androida (Control+Alt+A). Jeśli na pasku narzędzi wyświetla się Root Device (Urządzenie z dostępem do roota), kliknij go, aby ASfP uruchomił adb root i wyświetlił komunikat Device is rooted (Urządzenie ma dostęp do roota).
  2. Na pasku narzędzi u góry kliknij Pokaż procesy systemowe i odfiltruj proces docelowy.
  3. Weryfikowanie lokalnych symboli debugowania w panelu Biblioteki: wybranie procesu powoduje wypełnienie tabeli Biblioteki wszystkimi bibliotekami współdzielonymi ELF (.so) załadowanymi w procesie oraz pierwszymi 8 znakami szesnastkowymi identyfikatora kompilacji ELF. ASfP dopasowuje każdy identyfikator kompilacji do:out/target/product/<device>/symbols (symbols/.build-id jest wymagany do rozwiązywania bibliotek w pakietach APEX):
    • Zweryfikowane biblioteki są oznaczone ikoną znacznika wyboru. Wskaż dowolny rozwiązany wiersz, aby wyświetlić podgląd pełnej lokalnej ścieżki symbolu .debug.
    • Nierozwiązane biblioteki bez pasujących symboli lokalnych wyświetlają ikonę ostrzeżenia.
  4. Wykrywanie procesów innych niż Java: gdy wybierzesz proces C++ lub Rust (oznaczony ikoną sześciokąta C), ASfP ukryje Debuger Javy i wyświetli komunikat Debugowanie Javy jest niedostępne, to nie jest proces Javy, pozostawiając zaznaczone pole Debuger natywny.
  5. Ustaw punkty przerwania w plikach źródłowych C, C++ lub Rust, kliknij Dołącz i wywołaj ścieżkę kodu na urządzeniu.

Załącz kartę z tabelą bibliotek, identyfikatorami kompilacji ELF i zaznaczeniami lokalnych symboli.

Debugowanie kodu w Rust

ASfP debuguje kod platformy Rust za pomocą tego samego wbudowanego debugera LLDB, który jest używany w przypadku języków C i C++. Nie wymaga to zewnętrznego adaptera ani ręcznej konfiguracji serwera: ASfP używa lldb-dap z dołączonego łańcucha narzędzi i automatycznie wczytuje z wcześniej skompilowanych plików AOSP moduły formatujące Rust, dzięki czemu standardowe typy, takie jak String, Vec, HashMap i Option, wyświetlają wartości strukturalne w okienku Zmienne.

Dołączanie do działającego procesu Rust na urządzeniu

Wykonaj czynności opisane w sekcji Debugowanie procesu systemowego (C i C++): otwórz Uruchom > Dołącz do procesu Androida, sprawdź, czy opcja Urządzenie jest zrootowane jest zaznaczona, a symbole lokalne mają znacznik wyboru w panelu Biblioteki, pozostaw zaznaczoną opcję Debuger natywny i kliknij Dołącz. Ramki stosu Rust oraz C lub C++ pojawiają się razem w tej samej sesji debugowania.

Debugowanie modułu rust_test lub rust_test_host

  1. Otwórz plik Android.bp deklarujący rust_test lub rust_test_host element docelowy i kliknij ikonę Uruchom na marginesie obok typu modułu.
  2. Wybierz Debug '<ModuleName>' (Debuguj „<ModuleName>”). ASfP skompiluje projekt, uruchomi binarny plik testowy w LLDB na komputerze hosta lub połączonym urządzeniu i zatrzyma się w miejscach, w których ustawiono punkty przerwania w Rust.
  3. Aby debugować pojedynczą funkcję testową lub dostosować polecenia uruchamiania LLDB, otwórz Uruchom > Edytuj konfiguracje, wybierz wygenerowaną konfigurację Test Soong i ustaw Metodę lub rozwiń opcje Debuger. Więcej informacji o opcjach konfiguracji testu Soong znajdziesz w artykule Testowanie kodu platformy za pomocą narzędzia atest.

Debugowanie kodu platformy Rust za pomocą wizualizatorów zmiennych strukturalnych w ASfP