Мы проводим внутреннее тестирование SDV на оборудовании. Для виртуализации мы используем QVM на QNX. В качестве примеров мы предоставляем все целевые платформы, документацию и конфигурации.
Предварительные требования
На этой странице предполагается наличие предварительно настроенной системы QNX и не приводятся шаги по сборке, настройке или прошивке QNX на оборудовании.
На этой странице предполагается, что вы используете QNX на оборудовании arm64, а также собираете и используете целевые объекты _arm64 из SDV.
Необходимые компоненты
- Блок дерева устройств (DTB) для определения виртуального оборудования.
- Ядро Linux для использования
- Объединенный образ оперативной памяти, включающий все свойства загрузки этого образа.
- Передача цепочки DICE для аутентификации виртуальной машины SDV.
- Все разделы диска системы
- Конфигурация виртуальной машины в QVM.
Блок дерева устройств (DTB)
QVM генерирует большую часть двоичных данных дерева устройств (DTB) на основе своей конфигурации. Поэтому DTB может быть минимальным:
/*
* Copyright (C) 2026 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/dts-v1/;
/ {
model = "Virtual Machine";
#address-cells = <2>;
#size-cells = <2>;
// This reserved-memory node specifies for the open-dice driver which memory region(s) to
// expose as /dev/open-dice<n> device(s)
reserved-memory {
// The number of u32 cells to represent the address of a memory region
#address-cells = <2>;
// The number of u32 cells to represent the size of a memory region
#size-cells = <2>;
ranges;
// The unit address (after the @) must match the address in the reg property
dice@D1C30000 {
// The open-dice driver receives this device tree node based on this
// property.
compatible = "google,open-dice";
no-map;
// The address and the size of the memory region that is passed to the
// open-dice driver.
// First two hex numbers (cells) represent the address of the memory region,
// the last two represent its size (4K, in this case).
reg = <0x0 0xD1C30000 0x0 0x1000>;
};
};
};
Ядро
SDV использует универсальный образ ядра (GKI), и вы можете использовать результаты сборки напрямую.
Ramdisk
Информация о ramdisk должна включать различные ramdisk, создаваемые Android, и свойства загрузки. Поскольку QNX по умолчанию не поддерживает загрузчик, необходимо создать ramdisk с ожидаемым форматом данных .
Это можно сделать с помощью следующего скрипта на Python, который объединяет несколько образов ramdisk и добавляет bootconfig (файл vendor-bootconfig.img ) в ожидаемом формате:
def create_qnx_ramdisk(output: io.BytesIO,
ramdisks: Sequence[io.BytesIO],
bootconfig: Optional[io.BytesIO]):
BUFFER_SIZE = 4096
for ramdisk in ramdisks:
while buf := ramdisk.read(BUFFER_SIZE):
output.write(buf)
# Kernel looks for bootconfig at the end of ramdisk.
if bootconfig:
bootconfig_checksum = 0
bootconfig_size = 0
while buf := bootconfig.read(BUFFER_SIZE):
bootconfig_checksum = (bootconfig_checksum + sum(buf)) & 0xFFFFFFFF
bootconfig_size += len(buf)
output.write(buf)
output.write(struct.pack('II', bootconfig_size, bootconfig_checksum))
output.write(b'#BOOTCONFIG\n')
Цепочка DICE
В производственной системе хост-система и загрузчик динамически формируют цепочку DICE в процессе загрузки и предоставляют гостевой системе цепочку DICE для проверки достоверности образа. Поскольку это требование может усложнить процессы тестирования и разработки, вместо этого загружается снимок цепочки DICE.
Для генерации файлов dice_handover_instance* используйте любую сборку SDV Cuttlefish. Например:
lunch sdv_core_cf-trunk_staging-userdebug
m
cp $OUT/product/etc/dice_handover_instance* <GUEST>/test_dice_handover
Диск
QVM поддерживает несколько форматов виртуальных дисков; в нашей эталонной конфигурации используется файл образа диска, содержащий все разделы. bpttool может генерировать такие диски, но в Android он активно не разрабатывается.
Конфигурация QVM
Конфигурация QVM задаёт параметры и указывает на различные файлы. Мы предоставляем следующие примеры конфигураций:
- Конфигурация виртуальной машины ядра SDV
- Конфигурация виртуальной машины SDV Media
- Виртуальная машина IVI с интеграцией SDV
Часто задаваемые вопросы
В: adb не может подключиться к моей виртуальной машине. Что я могу сделать?
A: В этой конфигурации adb использует Ethernet для подключения к вашей виртуальной машине. Вам потребуется настроить переадресацию портов на QNX, которая будет перенаправлять запросы гостевым системам на порт 5555. Вам необходимо подключиться к хост-системе. В качестве альтернативы вы также можете настроить мост к виртуальной машине и подключиться к ней напрямую.
В: В системном журнале указано, что отсутствует объект IServiceRegistrationAgent. Почему?
A: Обнаружение сервисов зависит от полностью работоспособной настройки доверия и привязки. Убедитесь, что OpenDICE успешно загружен, и HwBinder не выдает ошибок при запуске. Если это не работает, сначала необходимо это исправить.
В: init_open_dice завершилась с ошибкой. Что произошло?
A: Скрипты запуска загружают информацию о доверительных отношениях во время запуска и очищают область памяти. Убедитесь в конфигурации QVM, что конфигурация командной строки и общие данные в области памяти совпадают. Также убедитесь, что область памяти в драйвере, конфигурации QVM и DTB совпадает, и что эта область памяти доступна для записи.