Отладка SDV

В этом руководстве рассказывается об основных инструментах и методах отладки сервисов и приложений, работающих на платформе SDV.

Подключитесь к устройству

Основной инструмент для подключения к устройству и взаимодействия с ним – Android Debug Bridge (adb). Убедитесь, что adb находится в системном пути.

Подключение через сеть

Если устройство находится в той же сети и вы знаете его IP-адрес, вы можете подключиться по Ethernet. Наша система использует для adb только сетевые подключения:

# Connect to the device using its IP address and default port
adb connect <device_ip_address>:5555

Подключение к нескольким устройствам

Чтобы управлять несколькими устройствами с одной рабочей станции, вы можете подключиться к ним через разные IP-адреса. Если на одном хосте запущено несколько виртуальных машин, каждой из них нужно назначить отдельный порт. Для этого нужно настроить фоновый процесс adb на каждом устройстве SDV так, чтобы он прослушивал уникальный порт, например 5555 для первого устройства и 5556 для второго. Вы также можете настроить хост для переадресации этих портов на разные гостевые системы:

# Connect to the first device
adb connect <device_1_ip_address>:5555

# Connect to a second device
adb connect <device_2_ip_address>:5555

# Connect to a second VM on first device on different port
adb connect <device_1_ip_address>:5556

# List all connected devices to verify
adb devices

При выполнении последующих команд adb вы можете указать конкретное устройство, используя флаг -s с полным адресом (ip:port):

# Run a shell command on the second VM on first device in the above example
adb -s <device_1_ip_address>:5556 shell

Просмотреть журналы

Если сервис работает со сбоями или не так, как ожидалось, в первую очередь проверьте журналы.

Как использовать logcat (журналы Android)

logcat показывает журналы системных служб, агентов и пакетов служб:

# View all logs in real-time
adb logcat

# Filter logs by a specific tag (e.g., the name of your service)
adb logcat -s MyServiceTag

# Filter logs by priority (V: Verbose, D: Debug, I: Info, W: Warn, E: Error, F: Fatal)
# This shows only Error and Fatal messages for a specific tag
adb logcat MyServiceTag:E *:S

# Clear old logs before viewing new ones
adb logcat -c && adb logcat

# Show all logs and return
adb logcat -d

# Color logs by level
adb logcat -v color

# Show timestamps as time since boot
adb logcat -v monotonic

Как использовать dmesg (журналы ядра)

dmesg – журналы ядра Linux. Это важно для отладки следующих элементов:

  • Проблемы с аппаратным обеспечением и драйверами
  • Сообщения Kernel panic : сбой ядра
  • Отказы SELinux (avc: denied) – также отображаются в logcat.
# View all kernel messages
adb shell dmesg

# Follow kernel messages in real-time
adb shell dmesg -w

Как получить доступ к журналам на Cuttlefish

При запуске на виртуальном устройстве Cuttlefish вы можете напрямую обращаться к файлам журнала из файловой системы хост-машины. Это особенно полезно, если adb недоступен. При запуске Cuttlefish выводит все пути отладки. Их также можно найти с помощью cvd fleet для всех запущенных экземпляров.

  • Logcat (журналы Android): cuttlefish/instances/cvd-1/logs/logcat
  • Журналы ядра: cuttlefish/instances/cvd-1/logs/kernel.log
  • Журналы средства запуска Cuttlefish: cuttlefish/instances/cvd-1/logs/launcher.log (полезны для отладки среды Cuttlefish)

Для просмотра этих файлов в реальном времени можно использовать стандартные инструменты командной строки, такие как cat, less или tail -f.

Взаимодействие с оболочкой и файловой системой

Получите доступ к оболочке, чтобы выполнять команды непосредственно на устройстве, проверять статус процессов и перемещаться по файловой системе.

# Open an interactive shell on the device
adb shell

# From within the shell, you can check running processes
ps -A

# Or check the status of a specific service managed by init
getprop init.svc.<service_name>

Выполнение операций с файловой системой

Для перемещения файлов между хостом и устройством используйте adb push и adb pull. Используйте его, чтобы развертывать тестовые скрипты, обновлять конфигурацию или получать аварийные дампы.

# Push a file from your computer to the device
adb push my_local_file.txt /data/local/tmp/

# Pull a file from the device to your computer
adb pull /data/tombstones/tombstone_00 .

Отладка приложений (C++/Rust)

Отладку приложений можно выполнять как в онлайн-, так и в офлайн-режиме.

Как использовать lldb для отладки в реальном времени

Чтобы отладить сервис в реальном времени с помощью lldb, выполните описанные ниже действия. Чтобы подключить отладчик из Android Studio for Platform, ознакомьтесь с разделами Отладка и тестирование и Отладка кода платформы.

  1. Перезапустите adb с правами root (требуется для переадресации портов):

    adb root
    
  2. Если в двоичном файле есть отладочные символы, отправьте версию с ними из out/target/product/[SDV_FLAVOR]/symbols/[PARTITION]/bin/[EXECUTABLE]. Например, чтобы загрузить rpcagent из system_ext и sdv_core_cf, выполните следующую команду:

    adb push out/target/product/sdv_core_cf/symbols/system_ext/bin/rpcagent /data/local/tmp
    
  3. Подключитесь к клиенту LLDB с помощью удобного скрипта lldbclient.py:

    # Run and connect a binary on device, run on host:
    lldbclient.py -r /data/local/tmp/rpcagent
    
    # Connect to an existing process with PID 2759
    lldbclient.py -p 2759
    

    Этот скрипт удаленно подключает lldb. Чтобы посмотреть все доступные флаги, выполните команду lldbclient.py --help.

Анализ аварийных дампов (tombstones)

При сбое в работе сервиса в каталоге /data/tombstones/ создается файл дампа. В нем содержится трассировка стека, карта памяти и другая важная информация.

Извлеките файл tombstone и проанализируйте его с помощью инструмента, поддерживающего символы (например, lldb или специального скрипта), и версии двоичного файла, содержащей символы.

Анализ эффективности

SDV поддерживает несколько инструментов для измерения производительности.

Проверьте загрузку процессора и памяти

  • top – показывает в реальном времени запущенные процессы, отсортированные по использованию ЦП.

    adb shell top -m 10  # Show top 10 processes
    
  • procrank – подробная информация об использовании памяти определенным процессом или всей системой.

    adb shell procrank
    

Как использовать dumpsys для получения информации о состоянии сервиса

dumpsys – это мощный инструмент для запроса внутреннего состояния любого системного сервиса Android.

# List all available services
adb shell dumpsys -l

# Dump the state of a specific service or agent
adb shell dumpsys <service_name>

Используйте torq для анализа производительности

torq – это инструмент командной строки, который упрощает профилирование и трассировку в Android. Она позволяет запускать Simpleperf, Perfetto и другие типичные задачи во время анализа производительности системы.

Как использовать Perfetto для трассировки

Perfetto – стандартный инструмент для трассировки на уровне системы в Android. Perfetto позволяет записывать системные события, точки трассировки на уровне приложения и счетчики производительности, а также визуализировать их на временной шкале.

Основные шаги:

  1. Добавьте точки трассировки в код C++ или Rust:
    • C++. Используйте Perfetto SDK с макросами TRACE_EVENT.
    • Rust. Используйте крейт tracing, который генерирует события ATrace, совместимые с Perfetto.
  2. Создайте файл конфигурации textproto, чтобы указать источники данных (например, ftrace, track_event), категории и теги.
  3. Чтобы получить трассировку с устройства, используйте скрипт record_android_trace (external/perfetto/tools/record_android_trace) с файлом конфигурации.
  4. Откройте созданный файл трассировки в веб-интерфейсе Perfetto, чтобы проанализировать поведение системы, выявить узкие места и понять, как взаимодействуют сервисы.

Подробные инструкции по инструментированию, настройке и сбору данных приведены в статье Как использовать трассировку для анализа производительности системы.

Как использовать Simpleperf для профилирования

Simpleperf – это универсальный инструмент командной строки для профилирования производительности на Android, похожий на Linux perf.

Примеры использования:

  • Профилирование ЦП. Позволяет определить, какие функции потребляют больше всего процессорного времени.
  • Анализ вне ЦП. Позволяет понять, почему потоки спят или заблокированы.
  • Счетчики оборудования. Доступ к счетчикам производительности оборудования.

Примеры команд:

# Go to simpleperf scripts
cd system/extras/simpleperf/scripts

# Profile system for 20 seconds and record call graph
./app_profiler.py --system_wide -r "--call-graph fp --duration 20"

# Record a profile for a specific process (PID 1)
./app_profiler.py --pid 1 -r "--call-graph fp --duration 5"

# Pull the profile data
adb pull /data/local/tmp/perf.data .

# Generate a report with symbol resolution
./report_html.py --add_source_code --source_dirs $ANDROID_BUILD_TOP --add_disassembly -o report.html

Simpleperf предлагает множество других событий и параметров. Подробную информацию можно найти в руководстве по Simpleperf.

Отказы SELinux

Проблема. Сервис не запускается, не может получить доступ к файлу или использовать функцию, и вы видите сообщение avc: denied в dmesg или logcat.

[ 123.456] avc: denied { read } for pid=789 comm="my_service" name="some_file" dev="sda1" ino=123 scontext=u:r:my_service_t:s0 tcontext=u:object_r:some_file_t:s0 tclass=file permissive=0

Быстрая отладка (только для разработки)

Вы можете временно отключить принудительное применение SELinux, чтобы проверить, решит ли это проблему. Это подтверждает, что проблема связана с отсутствием правила политики SELinux.

# Disabling SELinux requires root permission
adb root

# Set SELinux to permissive mode
adb shell setenforce 0

# Check the current mode (should return "Permissive")
adb shell getenforce

Решение. Запустите инструмент audit2allow из дерева исходного кода Android, указав сообщение об отказе. Будет создано правило .te, которое нужно добавить в конфигурацию SELinux на устройстве.