Cree su propio emulador de nube

Este artículo describe cómo ejecutar AAOS Emulator como un servicio web y ejecutarlo en un navegador web para que los usuarios puedan acceder a él de forma remota. Al hacerlo, se proporciona una referencia mínimamente viable de un extremo a otro a través de Google Cloud Compute Engine . Dicho esto, puede utilizar este servicio en cualquier plataforma de nube pública o privada de su elección.

Objetivo

Esta configuración y configuración centralizadas hacen que AAOS Emulator sea accesible para toda una empresa, proveedor y desarrolladores que trabajan desde casa. Hacerlo hace que sea más eficiente administrar y actualizar el emulador AAOS a nuevas versiones y elimina el tiempo necesario para configurar y administrar máquinas locales para usuarios individuales. Esta solución optimiza el uso de los recursos de hardware y permite un entorno de desarrollo de aplicaciones de menor costo. Por ejemplo, para efectos de:

  • Investigación de usuarios, revisión de la experiencia del usuario, atención al cliente y capacitación.
  • Demos a clientes potenciales y en canales de venta.
  • Pruebe, valide e incluso depure aplicaciones (incluidas las compilaciones HMI OEM diarias) a escala. Considere el emulador como un sustituto de los bancos de prueba que se usan para desarrollar aplicaciones.
  • Los agentes del centro de llamadas del cliente OEM tienen una interfaz de usuario de HU uniforme y de fácil acceso.

Los beneficios de usar el emulador AAOS son numerosos:

  • Utilice un script de configuración para crear un emulador de AAOS (emulador de nube) personalizado y basado en la nube.
  • Cree una imagen personalizada de AAOS Cloud Emulator para instancias de VM:
    • Configuración lista de un emulador basado en la nube.
    • Imágenes públicas de AAOS AVD disponibles para el creador del servicio para iniciar un AAOS AVD con un comando. Por ejemplo, imágenes AVD OEM públicas como muestras para que los socios las adapten y apliquen.

Arquitectura

La arquitectura del ejemplo del emulador de nube se ilustra a continuación. Su primer servicio mínimamente viable funcionará agregando sus propias imágenes OEM AVD.

Figura 1. Arquitectura de AVD en la nube

Los bloques de construcción clave del emulador son:

Artículo Objetivo
Emulador de Android La instancia del emulador aloja imágenes AVD
Puente Goldfish-webrtc Aplicación de Linux para proporcionar comunicación entre la aplicación de reacción y el emulador AAOS
android-emulador-webrtc Aplicación React para mostrar la interfaz de usuario del emulador en un navegador web. React también captura los eventos de entrada del usuario y los envía de vuelta al servidor.
Secuencias de comandos del contenedor del emulador de Android Scripts de Python para administrar y crear imágenes y contenedores de Docker para los módulos de software anteriores.
Servicio JWT (servicio de token web JSON) Genera tokens para gestionar los permisos de acceso del emulador.
Turno servidor Establece una conexión directa WebRTC entre el cliente y el servidor. Turn server es necesario solo cuando el servicio Emulator se ejecuta detrás de firewalls o proxies.
Enviado

Un servicio de proxy para:

  • Proporcione HTTPS utilizando un certificado autofirmado.
  • Redirigir el tráfico en el puerto 80 (http) al puerto 443 (https).
  • Actúa como un proxy gRPC para el emulador.
  • Verifique los tokens para permitir el acceso al extremo de gRPC del emulador.
  • Redirija otras solicitudes al componente Nginx, que aloja una aplicación React.

Configurar el emulador en una máquina virtual en la nube

Para crear un proyecto de GCP:

  1. Vaya a Google Cloud Console y seleccione un proyecto .
  2. Para confirmar que la facturación está habilitada para su proyecto de Google Cloud, consulte Habilitar, deshabilitar o cambiar la facturación de un proyecto .
  3. Habilite la API .

Crear una máquina virtual Linux en GCE

1. Habilite la virtualización anidada

De forma predeterminada, la virtualización anidada está permitida a nivel de proyecto, carpeta u organización. A menos que alguien en su organización haya deshabilitado la virtualización anidada , no necesita hacer nada para habilitarla.

  1. Use la herramienta de línea de comandos de gcloud para confirmar que la virtualización anidada está permitida:
    gcloud beta resource-manager org-policies describe   \
      constraints/compute.disableNestedVirtualization  --effective --project=[PROJECT_ID]
    

2. Cree un disco de arranque Ubuntu-1804-lts

  1. Vaya a Consola en la nube .
  2. Seleccione el proyecto GCP.
  3. Vaya al Menú de navegación > Compute Engine > Discos > Crear disco.
    1. Proporcione un nombre de disco. Por ejemplo, ubuntu1804lts
    2. Seleccione una Región y una Zona. Para admitir la virtualización anidada, asegúrese de que la región y la zona que seleccione sean compatibles con los procesadores Haswell (o posteriores). Para obtener más información, consulte Regiones y zonas .
    3. Seleccione la imagen de origen de ubuntu-1804-bionic-v20210211
    4. Establezca un tamaño de disco adecuado (se recomiendan 100 GB o más).

Figura 1. Crear un disco de arranque de Ubuntu

3. Cree una imagen personalizada con clave de licencia especial para habilitar VMX

  1. Vaya a la consola en la nube .
  2. Abra un Cloud Shell y use el siguiente comando:
    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"
    
    • Introduzca un nombre de imagen. Por ejemplo, aaos-emulator-image
    • Establezca Disk Zone en la zona en la que creó el disco.
    • Establezca el nombre del disco con el nombre que usó para crear el disco.

    Por ejemplo:

    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"
    

Para obtener más información, consulte Instancia de máquina virtual de virtualización anidada .

4. Crea una instancia de VM usando la imagen personalizada

  1. Vaya a Consola en la nube .
  2. Seleccione el proyecto GCP.
  3. Vaya a Menú de navegación > Compute Engine > Instancia de VM.

    Figura 1. Crear una instancia de VM

  4. Introduzca un nombre de instancia. Por ejemplo, aaosemulator
  5. Seleccione la familia y el tipo de máquina deseados. Asegúrese de que la máquina contenga cuatro vCPU y 16 GB de memoria (o más).
  6. Seleccione la plataforma de CPU para que sea Intel Cascade Lake (o posterior).
  7. Cambie el disco de arranque a la imagen creada en el paso anterior.
  8. Habilitar el cortafuegos para:
    • Permitir tráfico HTTP
    • Permitir tráfico HTTPS

5. Configure el firewall para abrir los puertos 80 y 443

  1. Vaya a Consola en la nube .
  2. seleccione el proyecto GCP.
  3. Vaya a Menú de navegación > Compute Engine > Instancia de VM > Configurar regla de firewall.

Instale el software necesario en la máquina virtual

  1. Instale Python 3 y Python3-env:
    sudo apt update
    sudo apt install python3
    sudo apt-get install python3-venv
    
  2. Instale Android SDK y ADB disponibles en la ruta.
    sudo apt install android-sdk
    

    Para instalar Docker y Docker-compose, consulte Docker y Docker-compose . Asegúrese de que puede ejecutarlos como usuario no root .

  3. Para confirmar que la CPU admite la virtualización de hardware (el comando debe generar un número distinto de cero):
    egrep -c '(vmx|svm)' /proc/cpuinfo
    
  4. Instale la máquina virtual del kernel (KVM). Para instalar KVM, ejecute:
    sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
    
  5. Para verificar que KVM esté funcionando:
    sudo apt install cpu-checker
    kvm-ok
    
    La salida debe ser:
    INFO: /dev/kvm exists
    KVM acceleration can be used
    
  6. Para instalar Node.js y Node Packet Manager (NPM):
    sudo apt install nodejs npm
    

Iniciar los contenedores alojados

  1. Para verificar la instalación, ejecute los contenedores de Android Emulator alojados desde el repositorio público. Puede encontrar detalles sobre los contenedores aquí . Ahora puede ejecutar estos contenedores sin construirlos. Por ejemplo:
    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
    

    Esto abre el contenedor (si no está disponible localmente) y lo inicia.

  2. Cuando se inicie el contenedor, conéctese al dispositivo configurando ADB de la misma manera que conecta un AVD en un host local. Por ejemplo:
    adb connect localhost:5555
    adb devices
    
    La salida debe ser:
    List of devices attached
    localhost:5555 device
    

Configurar el servicio del emulador AAOS

Para configurar el servicio del emulador:

  1. Instale la secuencia de comandos del contenedor de Android Emulator Docker:
    git clone https://github.com/google/android-emulator-container-scripts.git
    
    cd android-emulator-container-script
    source ./configure.sh
    
  2. Esto activa un entorno virtual y hace que el ejecutable emu-docker esté disponible. Para obtener información detallada sobre su uso, inícielo:
    emu-docker -h
    
  3. Para crear los contenedores de Docker, acepte los acuerdos de licencia.
  4. Cree el contenedor Docker del emulador de AAOS.
  5. Descargue una compilación de emulador posterior a la versión 7154743. Por ejemplo:
    sdk-repo-linux-emulator-7154743.zip
    
  6. Descargue la imagen del sistema del emulador AAOS. Por ejemplo, sdk-repo-linux-system-images-7115454.zip :
    emu-docker create <emulator-zip> <system-image-zip>
    
  7. Cree los contenedores web y establezca el nombre de usuario y la contraseña para el acceso remoto.
    ./create_web_container.sh -p user1,passwd1
    
  8. Inicie el servicio web del emulador AAOS:
    docker-compose -f js/docker/docker-compose-build.yaml -f js/docker/development.yaml up
    

¡Ha iniciado con éxito un servicio web de emulador de AAOS! Use lo siguiente para acceder a él en un navegador web:

https://<VM_External__IP>

Solución de problemas

Si se produce un error de conexión a la IP externa de la VM, asegúrese de que la VM esté configurada para permitir el tráfico HTTP y HTTPS. Para validar esto, consulte Ejecución de un servidor web Apache básico .

Configurar el servidor de turnos

Siempre puedes usar tu propio servidor de turnos. A continuación se proporciona una muestra en una instancia de VM de Google Cloud.

Nota: Para que el servidor de turnos funcione en una instancia de VM de Google Cloud, asegúrese de configurar la regla de firewall de VM para permitir el tráfico en los puertos TCP y UDP 3478 y 3479.

  1. Instale el servidor coturn:
    sudo apt install coturn
    systemctl stop coturn
    echo "TURNSERVER_ENABLED=1"|sudo tee -a /etc/default/coturn
    
  2. Modifique /etc/turnserver.conf agregando las siguientes líneas:
    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. Modifique el archivo YAML de Docker Compose para incluir la configuración TURN:
    cd android-emulator-container-script
    nano  js/docker/docker-compose-build.yaml
    
  4. Agregue las siguientes dos líneas de entorno en la sección del emulador:
         shm_size: 128M
         expose:
           - "8554"
    +    environment:
    +       - TURN=printf $SNIPPET
    
  5. Reinicie el servicio del emulador AAOS con la configuración de giro. Asegúrese de reemplazar la IP del servidor de giro, el nombre de usuario y la credencial a continuación con los suyos propios:
    export SNIPPET="{\"iceServers\":[{\"urls\":\"turn:35.193.52.134:3478\",\"username\":\"test\",\"credential\":\"test123\"}]}"
    docker-compose -f js/docker/docker-compose-build.yaml up