Темы



Cuttlefish на Mac: нативный запуск виртуальной среды Android на Apple Silicon

Коротко сгенерировано ИИ по тексту статьи
  • Reality Labs Meta перенесла Cuttlefish на macOS для нативного запуска виртуальных устройств Android на Mac с Apple silicon.
  • Для переноса возобновили поддержку QEMU и добавили совместимость vhost-user с macOS, поддержку HVF и нативный дисплей Cocoa.
  • Единая платформа заменила параллельное использование Goldfish и Cuttlefish; изменения для QEMU и Cuttlefish доступны в форке и наборе патчей.

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

Reality Labs компании Meta создает такие продукты, как умные очки с ИИ. Эмуляторы позволяют масштабировать разработку и тестирование, не полагаясь на дефицитное физическое оборудование.

Тестирование программного обеспечения для Android-устройств, отличных от телефонов, зависит от того, насколько точно виртуальное устройство воспроизводит поведение программного обеспечения физического продукта. Легковесный эмулятор, такой как Goldfish, решает часть задачи, однако отличия от реального устройства могут скрывать ошибки вплоть до поздних этапов разработки. Недостаточная точность также подрывает доверие к эмуляции устройств и усиливает зависимость от дефицитного физического оборудования.

Cuttlefish — это платформа виртуальных устройств Android Open Source Project (AOSP) для тестирования ПО Android на виртуальном оборудовании. Она загружает те же системные образы, что и реальное оборудование, и запускает полноценный программный стек на виртуальном оборудовании. Благодаря этому Cuttlefish точнее воспроизводит поведение физического устройства, чем легковесный эмулятор.

К сожалению, Cuttlefish поддерживается только в Linux, а наши разработчики приложений и библиотек работают на Mac с процессорами Apple. Поэтому нам пришлось одновременно поддерживать Goldfish и Cuttlefish.

Мы понимали: если удастся перейти на единую платформу на базе Cuttlefish, все разработчики смогут пользоваться одним и тем же высокоточным виртуальным устройством. Задача заключалась в том, чтобы перенести стек и обеспечить нативную работу Cuttlefish в macOS.

Последствия фрагментации

Поддержка двух платформ эмуляторов создавала серьезную операционную нагрузку: потребляла вычислительные ресурсы, сбивала разработчиков с толку и замедляла работу команды эмуляторов. Для каждого инструмента требовалась поддержка двух отдельных платформ, а инфраструктура и инженерные ресурсы распределялись между ними. Кроме того, разработчикам приходилось выбирать эмулятор в зависимости от того, как они работают: Goldfish запускался повсюду, но был менее точным, тогда как Cuttlefish требовал Linux.

В AOSP наблюдается такое же разделение: Goldfish предназначен для разработчиков приложений, а Cuttlefish — для разработчиков платформы Android. Пока мы сохраняли это разделение, нам приходилось сталкиваться с последствиями фрагментации.

Стек и пробелы в поддержке macOS

Cuttlefish — это уровень оркестрации, а компонент, который непосредственно запускает гостевую ОС, — монитор виртуальных машин (VMM). В Linux Cuttlefish обычно использует crosvm, но ранее в ней также поддерживался QEMU в качестве альтернативного VMM. Со временем эта интеграция перестала развиваться. Чтобы обеспечить нативную поддержку Apple silicon в macOS, мы возобновили поддержку QEMU.

Многие виртуальные устройства Cuttlefish используют бэкенды vhost-user — отдельные процессы, предоставляющие устройства virtio для QEMU через сокет. Архитектура продумана, но значительная ее часть создавалась с расчетом исключительно на Linux. Из-за трех таких предположений система не работает в macOS. Механизмы vhost-user доступны только в Linux и не собираются и не запускаются в других системах. Гипервизор Apple накладывает ограничения на ресурсы, которые QEMU не учитывал. Наконец, отсутствовали нативные средства вывода изображения, сборки и подписания кода. Мы решили все три проблемы.

Стек Cuttlefish на Mac. Cuttlefish оркестрирует виртуальные устройства на базе QEMU. Оранжевым выделены работы, специфичные для Mac: добавление поддержки macOS в vhost-user, увеличение числа слотов отслеживания областей памяти в бэкенде HVF для QEMU, а также использование нативных средств Cocoa для вывода изображения и подписания кода.

Перенос vhost-user за пределы Linux

Самые важные с точки зрения архитектуры изменения коснулись пути vhost-user в QEMU. Фронтенды, libvhost-user и дополнительные бэкенды, такие как vhost-user-blk, были доступны только в Linux. Мы смягчили эти ограничения сборки, чтобы фронтенды и библиотеки vhost-user можно было собирать как в macOS, так и в Linux. Благодаря этому бэкенды устройств Cuttlefish могут передавать управление QEMU на Mac так же, как и в Linux. Без этого высокоточная модель устройств, ради которой стоит использовать Cuttlefish, была бы недоступна за пределами Linux.

Работа в рамках Hypervisor.framework

На Apple silicon QEMU использует для ускорения HVF (Hypervisor.framework), а не KVM. Бэкенд HVF в QEMU не отслеживал достаточное количество областей памяти для крупных конфигураций Cuttlefish. Мы увеличили число слотов отслеживания, чтобы такие конфигурации работали корректно.

Удобный нативный дисплей

Для локальной разработки приложений нужен интерактивный дисплей, позволяющий разработчикам видеть виртуальное устройство и взаимодействовать с ним напрямую. Чтобы обеспечить прямое взаимодействие и отказаться от зависимости от интерфейса WebRTC, мы перешли на нативный дисплей Cocoa в QEMU. Изменения включают:

  • Поддержка формата пикселей BGRA: обеспечивает точное отображение и устраняет визуальные артефакты на Apple silicon.
  • Преобразование щелчка мыши в касание: преобразует действия указателя в сенсорный ввод для взаимодействия с устройствами с сенсорным экраном.
  • Настройка геометрии: добавляет флаг -g для graphic_console_init, позволяющий настраивать дисплей.

Мы также включили нестабильные структуры Rutabaga, необходимые для соответствия графическому ABI на стороне Rust в конфигурациях gfxstream/rutabaga.

Сборка и подписание на Apple silicon

Наконец, потребовалось наладить сборку и упаковку: добавить начальную поддержку сборки для Darwin, собирать QEMU для arm64 в macOS и исправить инструментарий. Для сборок macOS также требовалось разрешение JIT, а кроме того — поддержка подписания кода и нотариального заверения. На стороне Cuttlefish мы добавили поддержку хост-системы macOS, чтобы сборка и запуск оркестрационной платформы работали на Mac, а не предполагали наличие хоста Linux.

Преимущества

Переход на единую платформу позволил нам сократить затраты на поддержку, уменьшить потребность в инфраструктуре, устранить дублирование инструментов, повысить точность и гарантировать, что разработчики используют те же виртуальные устройства Cuttlefish, что и в CI.

Единая платформа также упростила поддержку возможностей на общем стеке, в том числе:

  • Bluetooth: сопряжение и подключение.
  • Wi-Fi.
  • Сотовая связь.
  • 3D-графика.
  • Тестирование обновлений по воздуху (OTA) для проверки сценариев обновления на виртуальном устройстве.
  • Fastboot.
  • Снимки состояния для сохранения и восстановления состояния устройства в CI и в процессе разработки.

Это виртуальное устройство используется не только инженерами Reality Labs, но и внешними разработчиками, создающими продукты для нашей экосистемы. Благодаря такому единообразию сторонние команды тестируют свои решения на той же платформе на базе Cuttlefish, которую мы используем для разработки и проверки самой ОС.

По мере того как ИИ-агенты играют все более важную роль в разработке Android, выполнение проверок и поведение среды во время работы становятся не менее важными, чем генерация кода. Виртуальные устройства позволяют инженерам и автоматизированным агентам одновременно работать в изолированных средах, запускать приложения и быстро вносить изменения. Мгновенный сброс состояния и повторный запуск тестов позволяют командам не зависеть от общего физического оборудования и избегать перебоев в рабочих процессах. В конечном счете высокоточная эмуляция обеспечивает быстроту и содержательность этих непрерывных циклов обратной связи.

Вклад в развитие сообщества

Хотя мы создавали это решение для разработки в Reality Labs, поддержка macOS пригодится и за пределами наших продуктов. Мы делимся результатами работы с сообществом, чтобы другие разработчики могли опираться на базовые решения QEMU и AOSP, которые сделали нашу работу возможной.

Мы публикуем результаты в двух частях:

В репозиториях находятся наши изменения для QEMU и серия патчей для Cuttlefish, а также инструкции по сборке и применению патчей.

Мы также изучаем возможности передать эти изменения в основные проекты QEMU и AOSP. Пока же разработчики могут пользоваться нашим форком и набором патчей.

Благодарности

Этот проект опирается на фундамент, заложенный сообществами QEMU и Cuttlefish/AOSP. Мы особенно благодарны за реализацию vsock-user, созданную Стефано Гарзареллой, которая непосредственно помогла интегрировать решение в macOS.

Также благодарим Олю Архангельскую и Тома Кэра из Meta за основополагающую работу по переносу Cuttlefish на macOS, а Джеффри Эффенди — за улучшение среды разработки для Mac и дальнейшую подготовку решения к внедрению в продукт.

© Engineering at Meta