Construye tu propio emulador de nube

Esta página 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, puedes utilizar este servicio en cualquier plataforma de nube pública o privada de tu elección.

Objetivo

Esta configuración centralizada hace que AAOS Emulator sea accesible para toda una empresa, proveedor y desarrolladores que trabajan desde casa. Esto 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 recursos de hardware y permite un entorno de desarrollo de aplicaciones de menor costo. Por ejemplo, para fines de:

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

Los beneficios de utilizar el emulador AAOS son numerosos:

  • Utilice un script de configuración para crear un emulador 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 que el creador del servicio inicie un AAOS AVD con un comando. Por ejemplo, imágenes públicas de AVD OEM 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 AVD OEM.

Figura 1. Arquitectura AVD en la nube.

Los componentes clave del emulador son:

aquí .
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
emulador-android-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 regreso al servidor.
Scripts de 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.
Genera tokens para gestionar los permisos de acceso del emulador.
Convertir servidor Establece una conexión directa WebRTC entre el cliente y el servidor. Turn Server solo es necesario cuando el servicio Emulator se ejecuta detrás de firewalls o servidores proxy.
Enviado

Un servicio proxy para:

  • Proporcione HTTPS mediante un certificado autofirmado.
  • Redirigir el tráfico en el puerto 80 (http) al puerto 443 (https).
  • Actúa como proxy gRPC para el emulador.
  • Verifique los tokens para permitir el acceso al punto final 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 tu proyecto de Google Cloud, consulta 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 de su organización haya deshabilitado la virtualización anidada , no necesita hacer nada para habilitarla.

  1. Usa la herramienta de línea de comandos de gcloud para confirmar que se permite la virtualización anidada:
    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 la Consola de la nube .
  2. Seleccione el proyecto GCP.
  3. Vaya al menú de navegación y seleccione Compute Engine > Discos > Crear disco .
    1. Proporcione un nombre de disco. Por ejemplo, ubuntu1804lts
    2. Seleccione una Región y Zona. Para admitir la virtualización anidada, asegúrese de que la región y la zona que seleccione admitan procesadores Haswell (o posteriores). Para obtener más información, consulte Regiones y zonas .
    3. Seleccione la imagen fuente de ubuntu-1804-bionic-v20210211
    4. Establezca un tamaño de disco apropiado (se recomiendan 100 GB o más).

Figura 2. Cree un disco de arranque de Ubuntu.

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

  1. Vaya a la Consola de la nube .
  2. Abra 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"
    
    • Ingrese 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 utilizó 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 VM de virtualización anidada .

4. Cree una instancia de VM usando la imagen personalizada.

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

    Figura 3. Cree una instancia de VM.

  4. Introduzca un nombre de instancia. Por ejemplo, aaosemulator
  5. Seleccione la familia y el tipo de máquina deseada. 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. Habilite el firewall para:
    • Permitir el tráfico HTTP
    • Permitir el tráfico HTTPS

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

  1. Vaya a la Consola de 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 requerido en la VM

  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 poder ejecutarlos como usuario no root .

  3. Para confirmar que la CPU admite la virtualización de hardware (el comando debe dar como resultado un número distinto de cero):
    egrep -c '(vmx|svm)' /proc/cpuinfo
    
  4. Instale la máquina virtual del núcleo (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 alojados del emulador de Android desde el repositorio público. Puede encontrar detalles sobre los contenedores aquí . Ahora puede ejecutar estos contenedores sin compilarlos. 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 despliega 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 el script del contenedor Docker del emulador de Android:
    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, ejecútelo:
    emu-docker -h
    
  3. Para crear los contenedores Docker, acepte los acuerdos de licencia.
  4. Construya el contenedor Docker del emulador AAOS.
  5. Descargue una compilación del 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 AAOS! Utilice 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 utilizar tu propio servidor de turnos. A continuación se proporciona un ejemplo de 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 AAOS Emulator con la configuración de turno. Asegúrese de reemplazar la IP, el nombre de usuario y la credencial del servidor de turnos 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