Создайте свой собственный облачный эмулятор

В этой статье описывается, как запустить эмулятор AAOS в качестве веб-службы и запустить его в веб-браузере, чтобы сделать его удаленно доступным для пользователей. Это обеспечивает сквозную, минимально жизнеспособную ссылку через Google Cloud Compute Engine . Тем не менее, вы можете использовать эту услугу на любой общедоступной или частной облачной платформе по вашему выбору.

Цель

Эта централизованная конфигурация и настройка делают эмулятор AAOS доступным для всей компании, поставщика и разработчиков, работающих на дому. Это повышает эффективность управления эмулятором AAOS и его обновления до новых версий, а также сокращает время, необходимое для настройки и управления локальными машинами для отдельных пользователей. Это решение оптимизирует использование аппаратных ресурсов и обеспечивает более дешевую среду разработки приложений. Например, в целях:

  • Исследование пользователей, обзор пользовательского опыта, поддержка клиентов и обучение.
  • Демонстрации для потенциальных клиентов и в каналах продаж.
  • Тестируйте, проверяйте и даже отлаживайте приложения (включая ежедневные сборки OEM HMI) в любом масштабе. Считайте эмулятор заменой тестовых стендов, используемых для разработки приложений.
  • Агенты центра обработки вызовов OEM-клиентов имеют унифицированный и удобный пользовательский интерфейс HU.

Преимущества использования эмулятора AAOS многочисленны:

  • Используйте сценарий установки, чтобы создать настроенный облачный эмулятор AAOS (облачный эмулятор).
  • Создайте настроенный образ облачного эмулятора AAOS для экземпляров ВМ:
    • Готовая настройка облачного эмулятора.
    • Общедоступные образы AAOS AVD, доступные создателю службы для запуска AAOS AVD с помощью команды. Например, общедоступные образы OEM AVD в качестве образцов для адаптации и применения партнерами.

Архитектура

Архитектура примера облачного эмулятора показана ниже. Ваш первый минимально жизнеспособный сервис будет работать, добавляя собственные образы OEM AVD.

Рис. 1. Архитектура облачного AVD

Основные строительные блоки эмулятора:

Вещь Цель
Эмулятор Android Экземпляр эмулятора размещает образы AVD
Мост Goldfish-webrtc Приложение Linux для обеспечения связи между реагирующим приложением и эмулятором AAOS.
Android-эмулятор-webrtc Приложение React для отображения пользовательского интерфейса эмулятора в веб-браузере. React также фиксирует события пользовательского ввода и отправляет их обратно на сервер.
Скрипты контейнера эмулятора Android Скрипты Python для управления и создания образов и контейнеров Docker для вышеуказанных программных модулей.
Служба JWT (служба веб-токенов JSON) Создает токены для управления правами доступа эмулятора.
Включите сервер Устанавливает прямое соединение WebRTC между клиентом и сервером. Turn server требуется только тогда, когда служба эмулятора работает за брандмауэрами или прокси-серверами.
посланник

Прокси-сервис для:

  • Обеспечьте HTTPS с помощью самозаверяющего сертификата.
  • Перенаправить трафик с порта 80 (http) на порт 443 (https).
  • Действуйте как прокси-сервер gRPC для эмулятора.
  • Проверьте токены, чтобы разрешить доступ к конечной точке эмулятора gRPC.
  • Перенаправляйте другие запросы к компоненту Nginx, в котором размещено приложение React.

Настройте эмулятор на облачной виртуальной машине

Чтобы создать проект GCP:

  1. Перейдите в Google Cloud Console и выберите проект .
  2. Чтобы убедиться, что выставление счетов включено для вашего проекта Google Cloud, см. раздел Включение, отключение или изменение выставления счетов для проекта .
  3. Включите API .

Создайте виртуальную машину Linux в GCE

1. Включите вложенную виртуализацию

По умолчанию вложенная виртуализация разрешена на уровне проекта, папки или организации. Если кто-то в вашей организации не отключил вложенную виртуализацию , вам не нужно ничего делать, чтобы включить ее.

  1. Используйте инструмент командной строки gcloud, чтобы убедиться, что вложенная виртуализация разрешена:
    gcloud beta resource-manager org-policies describe   \
      constraints/compute.disableNestedVirtualization  --effective --project=[PROJECT_ID]
    

2. Создайте загрузочный диск Ubuntu-1804-lts.

  1. Перейдите в облачную консоль .
  2. Выберите проект GCP.
  3. Перейдите в меню навигации > Compute Engine > Диски > Создать диск.
    1. Укажите имя диска. Например, ubuntu1804lts
    2. Выберите регион и зону. Для поддержки вложенной виртуализации убедитесь, что выбранные вами регион и зона поддерживают процессоры Haswell (или более поздних версий). Дополнительные сведения см. в разделе Регионы и зоны .
    3. Выберите исходный образ ubuntu-1804-bionic-v20210211
    4. Установите соответствующий размер диска (рекомендуется 100 ГБ или больше).

Рисунок 1. Создание загрузочного диска Ubuntu

3. Создайте собственный образ со специальным лицензионным ключом для включения VMX.

  1. Перейдите в облачную консоль .
  2. Откройте Cloud Shell и используйте следующую команду:
    gcloud compute images create [IMAGE NAME] --source-disk-zone [DISK ZONE] --source-disk [DISK NAME] \
      --licenses "https://www.googleapis.com/compute/v1/projects/vm-options/global/licenses/enable-vmx"
    
    .
    • Введите имя изображения. Например, aaos-emulator-image
    • Задайте Disk Zone для зоны, в которой вы создали диск.
    • Установите имя диска на имя, которое вы использовали для создания диска.

    Например:

    gcloud compute images create aaos-emulator-image --source-disk-zone us-central1-a \
        --source-disk ubuntu1804lts \
        --licenses \
        "https://www.googleapis.com/compute/v1/projects/vm-options/global/licenses/enable-vmx"
    

Дополнительные сведения см. в разделе Экземпляр виртуальной машины вложенной виртуализации .

4. Создайте экземпляр виртуальной машины, используя настроенный образ.

  1. Перейдите в облачную консоль .
  2. Выберите проект GCP.
  3. Перейдите в Меню навигации > Compute Engine > Экземпляр виртуальной машины.

    Рисунок 1. Создание экземпляра виртуальной машины

  4. Введите имя экземпляра. Например, aaosemulator
  5. Выберите нужное семейство машин и тип. Убедитесь, что машина содержит четыре виртуальных ЦП и 16 ГБ памяти (или больше).
  6. Выберите платформу ЦП Intel Cascade Lake (или более позднюю).
  7. Измените загрузочный диск на образ, созданный на предыдущем шаге.
  8. Включить брандмауэр для:
    • Разрешить HTTP-трафик
    • Разрешить HTTPS-трафик

5. Настройте брандмауэр для открытия портов 80 и 443.

  1. Перейдите в облачную консоль .
  2. выберите проект GCP.
  3. Перейдите в Меню навигации > Compute Engine > Экземпляр ВМ > Настроить правило брандмауэра.

Установите необходимое программное обеспечение на виртуальную машину

  1. Установите Python 3 и Python3-env:
    sudo apt update
    sudo apt install python3
    sudo apt-get install python3-venv
    
  2. Установите Android SDK и ADB, доступные по пути.
    sudo apt install android-sdk
    

    Чтобы установить Docker и Docker-compose, см. раздел Docker и Docker-compose . Убедитесь, что вы можете запустить их как пользователь без полномочий root .

  3. Чтобы убедиться, что ЦП поддерживает аппаратную виртуализацию (команда должна дать ненулевое число):
    egrep -c '(vmx|svm)' /proc/cpuinfo
    
  4. Установите виртуальную машину ядра (KVM). Чтобы установить KVM, запустите:
    sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
    
  5. Чтобы убедиться, что KVM работает:
    sudo apt install cpu-checker
    kvm-ok
    
    Вывод должен быть:
    INFO: /dev/kvm exists
    KVM acceleration can be used
    
  6. Чтобы установить Node.js и Node Packet Manager (NPM):
    sudo apt install nodejs npm
    

Запустите размещенные контейнеры

  1. Чтобы проверить установку, запустите размещенные контейнеры эмулятора Android из общедоступного репозитория. Подробнее о контейнерах можно узнать здесь . Теперь вы можете запускать эти контейнеры, не создавая их. Например:
    docker run \
      -e ADBKEY="$(cat ~/.android/adbkey)" \
      --device /dev/kvm \
      --publish 8554:8554/tcp \
      --publish 5555:5555/tcp  \
      us-docker.pkg.dev/android-emulator-268719/images/30-google-x64:30.1.2
    

    Это вытаскивает контейнер (если он недоступен локально) и запускает его.

  2. Когда контейнер запущен, подключитесь к устройству, настроив ADB так же, как подключите AVD на локальном хосте. Например:
    adb connect localhost:5555
    adb devices
    
    Вывод должен быть:
    List of devices attached
    localhost:5555 device
    

Настройте службу эмулятора AAOS

Чтобы настроить службу эмулятора:

  1. Установите сценарий контейнера Docker эмулятора Android:
    git clone https://github.com/google/android-emulator-container-scripts.git
    
    cd android-emulator-container-script
    source ./configure.sh
    
  2. Это активирует виртуальную среду и делает доступным исполняемый файл emu-docker. Чтобы получить подробную информацию о его использовании, запустите его:
    emu-docker -h
    
  3. Чтобы создать контейнеры Docker, примите лицензионные соглашения.
  4. Создайте контейнер Docker эмулятора AAOS.
  5. Загрузите сборку эмулятора более поздней версии, чем 7154743. Например:
    sdk-repo-linux-emulator-7154743.zip
    
    .
  6. Загрузите образ системы эмулятора AAOS. Например, sdk-repo-linux-system-images-7115454.zip :
    emu-docker create <emulator-zip> <system-image-zip>
    
  7. Создайте веб-контейнеры и задайте имя пользователя и пароль для удаленного доступа.
    ./create_web_container.sh -p user1,passwd1
    
  8. Запустите веб-службу эмулятора AAOS:
    docker-compose -f js/docker/docker-compose-build.yaml -f js/docker/development.yaml up
    

Вы успешно запустили веб-службу эмулятора AAOS! Используйте следующее, чтобы получить к нему доступ в веб-браузере:

https://<VM_External__IP>

Исправление проблем

Если возникает ошибка подключения к внешнему IP-адресу виртуальной машины, убедитесь, что виртуальная машина настроена на разрешение трафика HTTP и HTTPS. Чтобы убедиться в этом, см. Запуск базового веб-сервера Apache .

Настроить поворотный сервер

Вы всегда можете использовать свой собственный сервер поворота. Ниже приведен пример экземпляра виртуальной машины Google Cloud.

Примечание. Чтобы сервер Turn работал на экземпляре виртуальной машины Google Cloud, обязательно настройте правило брандмауэра виртуальной машины, чтобы разрешить трафик через порты TCP и UDP 3478 и 3479.

  1. Установите сервер coturn:
    sudo apt install coturn
    systemctl stop coturn
    echo "TURNSERVER_ENABLED=1"|sudo tee -a /etc/default/coturn
    
  2. Измените /etc/turnserver.conf , добавив следующие строки:
    lt-cred-mech
    #set your realm name
    realm=test
    #coturn username and password
    user=test:test123
    # external-ip=<VM-Public-IP>/<VM-Private-IP>
    external-ip=34.193.52.134/10.128.0.2
    
    systemctl start coturn
    
  3. Измените YAML-файл Docker Compose, включив в него конфигурацию TURN:
    cd android-emulator-container-script
    nano  js/docker/docker-compose-build.yaml
    
    .
  4. Добавьте следующие две строки среды в раздел эмулятора:
         shm_size: 128M
         expose:
           - "8554"
    +    environment:
    +       - TURN=printf $SNIPPET
    
    .
  5. Перезапустите службу эмулятора AAOS с конфигурацией поворота. Обязательно замените IP-адрес сервера поворота, имя пользователя и учетные данные ниже своими собственными:
    export SNIPPET="{\"iceServers\":[{\"urls\":\"turn:35.193.52.134:3478\",\"username\":\"test\",\"credential\":\"test123\"}]}"
    docker-compose -f js/docker/docker-compose-build.yaml up