Отладка 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. Это крайне важно для отладки следующих задач:

  • Проблемы с оборудованием и драйверами
  • Паника ядра
  • Сообщения об отказе 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++/Russ)

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

Используйте lldb для отладки в реальном времени.

lldb — это отладчик по умолчанию в Android Studio, и его часто предпочитают для современной разработки на C++ и Rust.

Выполните следующие шаги по настройке:

  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
    

    Теперь необработанная версия находится в /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 . Для подключения к lldb обратитесь к документации вашей IDE.

Анализ дампов памяти (надгробий) после сбоев.

При сбое службы в каталоге /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++: Используйте SDK Perfetto с макросами 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, аналогичный инструменту perf в Linux.

Типичные сценарии использования:

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

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

# 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 вашего устройства.