Erstellen Sie Ihren eigenen Cloud-Emulator

In diesem Artikel wird beschrieben, wie Sie den AAOS-Emulator als Webdienst ausführen und ihn in einem Webbrowser ausführen, um ihn für Benutzer aus der Ferne zugänglich zu machen. Dadurch wird eine durchgängige, minimal brauchbare Referenz über die Google Cloud Compute Engine bereitgestellt. Sie können diesen Dienst jedoch auf jeder öffentlichen oder privaten Cloud-Plattform Ihrer Wahl nutzen.

Zweck

Diese zentralisierte Konfiguration und Einrichtung macht den AAOS-Emulator für ein ganzes Unternehmen, einen Lieferanten und Entwickler, die von zu Hause aus arbeiten, zugänglich. Dadurch wird die Verwaltung und Aktualisierung des AAOS-Emulators auf neue Versionen effizienter und es entfällt die Zeit, die für die Einrichtung und Verwaltung lokaler Maschinen für einzelne Benutzer erforderlich ist. Diese Lösung optimiert die Nutzung von Hardwareressourcen und ermöglicht eine kostengünstigere App-Entwicklungsumgebung. Zum Beispiel für folgende Zwecke:

  • Benutzerforschung, Überprüfung der Benutzererfahrung, Kundensupport und Schulung.
  • Demos bei potenziellen Kunden und in Vertriebskanälen.
  • Testen, validieren und debuggen Sie Apps (einschließlich täglicher OEM-HMI-Builds) in großem Maßstab. Betrachten Sie den Emulator als Ersatz für die Prüfstände, die zur Entwicklung von Apps verwendet werden.
  • Callcenter-Agenten von OEM-Kunden verfügen über eine einheitliche, leicht zugängliche HU-Benutzeroberfläche.

Die Verwendung des AAOS-Emulators bietet zahlreiche Vorteile:

  • Verwenden Sie ein Setup-Skript, um einen benutzerdefinierten und cloudbasierten AAOS-Emulator (Cloud-Emulator) zu erstellen.
  • Erstellen Sie ein angepasstes AAOS Cloud Emulator-Image für VM-Instanzen:
    • Fertige Einrichtung eines cloudbasierten Emulators.
    • Öffentliche AAOS AVD-Images, die dem Dienstersteller zum Starten eines AAOS AVD mit einem Befehl zur Verfügung stehen. Zum Beispiel öffentliche OEM-AVD-Bilder als Beispiele für Partner zum Anpassen und Anwenden.

Die Architektur

Die Architektur des Cloud-Emulator-Beispiels ist unten dargestellt. Ihr erster minimal realisierbarer Dienst funktioniert durch das Hinzufügen Ihrer eigenen OEM-AVD-Bilder.

Abbildung 1. Cloud AVD-Architektur

Die wichtigsten Emulatorbausteine ​​sind:

Hier .
Artikel Zweck
Android-Emulator Die Emulatorinstanz hostet AVD-Bilder
Goldfish-Webrtc-Brücke Linux-Anwendung zur Bereitstellung der Kommunikation zwischen der React-App und dem AAOS-Emulator
Android-Emulator-webrtc Reagieren Sie mit der Anwendung, um die Emulator-Benutzeroberfläche in einem Webbrowser anzuzeigen. React erfasst auch Benutzereingabeereignisse und sendet sie an den Server zurück.
Android-Emulator-Containerskripte Python-Skripte zum Verwalten und Erstellen von Docker-Images und Containern für die oben genannten Softwaremodule.
Erzeugt Token zur Verwaltung der Zugriffsberechtigungen des Emulators.
Server umdrehen Stellt eine direkte WebRTC-Verbindung zwischen dem Client und dem Server her. Der Turn-Server ist nur erforderlich, wenn der Emulatordienst hinter Firewalls oder Proxys ausgeführt wird.
Gesandte

Ein Proxy-Dienst für:

  • Stellen Sie HTTPS mit einem selbstsignierten Zertifikat bereit.
  • Leiten Sie den Datenverkehr auf Port 80 (http) auf Port 443 (https) um.
  • Fungiert als gRPC-Proxy für den Emulator.
  • Überprüfen Sie die Token, um den Zugriff auf den gRPC-Endpunkt des Emulators zu ermöglichen.
  • Leiten Sie andere Anfragen an die Nginx-Komponente um, die eine React-Anwendung hostet.

Richten Sie den Emulator auf einer Cloud-VM ein

So erstellen Sie ein GCP-Projekt:

  1. Gehen Sie zur Google Cloud Console und wählen Sie ein Projekt aus .
  2. Um zu bestätigen, dass die Abrechnung für Ihr Google Cloud-Projekt aktiviert ist, lesen Sie den Abschnitt Abrechnung für ein Projekt aktivieren, deaktivieren oder ändern .
  3. Aktivieren Sie die API .

Erstellen Sie eine Linux-VM in GCE

1. Aktivieren Sie die verschachtelte Virtualisierung

Standardmäßig ist verschachtelte Virtualisierung auf Projekt-, Ordner- oder Organisationsebene zulässig. Sofern nicht jemand in Ihrer Organisation die verschachtelte Virtualisierung deaktiviert hat, müssen Sie nichts tun, um sie zu aktivieren.

  1. Verwenden Sie das gcloud-Befehlszeilentool, um zu bestätigen, dass Nested Virtualization zulässig ist:
    gcloud beta resource-manager org-policies describe   \
      constraints/compute.disableNestedVirtualization  --effective --project=[PROJECT_ID]
    

2. Erstellen Sie eine bootfähige Ubuntu-1804-lts-Diskette

  1. Gehen Sie zur Cloud Console .
  2. Wählen Sie das GCP-Projekt aus.
  3. Gehen Sie zu Navigationsmenü > Compute Engine > Datenträger > Datenträger erstellen.
    1. Geben Sie einen Datenträgernamen an. Zum Beispiel ubuntu1804lts
    2. Wählen Sie eine Region und Zone aus. Um Nested Virtualization zu unterstützen, stellen Sie sicher, dass die von Ihnen ausgewählte Region und Zone Haswell-Prozessoren (oder höher) unterstützen. Weitere Informationen finden Sie unter Regionen und Zonen .
    3. Wählen Sie das Quellbild von ubuntu-1804-bionic-v20210211 aus
    4. Stellen Sie eine geeignete Festplattengröße ein (100 GB oder mehr werden empfohlen).

Abbildung 1. Erstellen Sie eine bootfähige Ubuntu-Diskette

3. Erstellen Sie ein benutzerdefiniertes Image mit einem speziellen Lizenzschlüssel, um VMX zu aktivieren

  1. Gehen Sie zur Cloud Console .
  2. Öffnen Sie eine Cloud Shell und verwenden Sie den folgenden Befehl:
    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"
    
    • Geben Sie einen Bildnamen ein. Zum Beispiel aaos-emulator-image
    • Legen Sie die Festplattenzone auf die Zone fest, in der Sie die Festplatte erstellt haben.
    • Legen Sie den Datenträgernamen auf den Namen fest, den Sie zum Erstellen des Datenträgers verwendet haben.

    Zum Beispiel:

    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"
    

Einzelheiten finden Sie unter Verschachtelte Virtualisierungs-VM-Instanz .

4. Erstellen Sie eine VM-Instanz mit dem angepassten Image

  1. Gehen Sie zur Cloud Console .
  2. Wählen Sie das GCP-Projekt aus.
  3. Gehen Sie zu Navigationsmenü > Compute Engine > VM-Instanz.

    Abbildung 1. Erstellen Sie eine VM-Instanz

  4. Geben Sie einen Instanznamen ein. Zum Beispiel aaosemulator
  5. Wählen Sie die gewünschte Maschinenfamilie und den gewünschten Typ aus. Stellen Sie sicher, dass die Maschine über vier vCPUs und 16 GB Arbeitsspeicher (oder mehr) verfügt.
  6. Wählen Sie als CPU-Plattform Intel Cascade Lake (oder höher) aus.
  7. Ändern Sie die Bootdiskette auf das im vorherigen Schritt erstellte Image.
  8. Firewall aktivieren für:
    • HTTP-Verkehr zulassen
    • HTTPS-Verkehr zulassen

5. Konfigurieren Sie die Firewall so, dass die Ports 80 und 443 geöffnet werden

  1. Gehen Sie zur Cloud Console .
  2. Wählen Sie das GCP-Projekt aus.
  3. Gehen Sie zu Navigationsmenü > Compute Engine > VM-Instanz > Firewall-Regel einrichten.

Installieren Sie die erforderliche Software auf der VM

  1. Installieren Sie Python 3 und Python3-env:
    sudo apt update
    sudo apt install python3
    sudo apt-get install python3-venv
    
  2. Installieren Sie das im Pfad verfügbare Android SDK und ADB.
    sudo apt install android-sdk
    

    Informationen zur Installation von Docker und Docker-compose finden Sie unter Docker und Docker-compose . Stellen Sie sicher, dass Sie diese als Nicht-Root-Benutzer ausführen können.

  3. Um zu bestätigen, dass die CPU Hardwarevirtualisierung unterstützt (der Befehl sollte eine Zahl ungleich Null ergeben):
    egrep -c '(vmx|svm)' /proc/cpuinfo
    
  4. Installieren Sie die Kernel Virtual Machine (KVM). Um KVM zu installieren, führen Sie Folgendes aus:
    sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
    
  5. Um zu überprüfen, ob KVM funktioniert:
    sudo apt install cpu-checker
    kvm-ok
    
    Die Ausgabe sollte sein:
    INFO: /dev/kvm exists
    KVM acceleration can be used
    
  6. So installieren Sie Node.js und Node Packet Manager (NPM):
    sudo apt install nodejs npm
    

Starten Sie die gehosteten Container

  1. Um die Installation zu überprüfen, führen Sie die gehosteten Android-Emulator-Container aus dem öffentlichen Repository aus. Details zu den Containern finden Sie hier . Sie können diese Container jetzt ausführen, ohne sie zu erstellen. Beispiel:
    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
    

    Dadurch wird der Container heruntergezogen (sofern er nicht lokal verfügbar ist) und gestartet.

  2. Wenn der Container gestartet wird, stellen Sie eine Verbindung zum Gerät her, indem Sie ADB auf die gleiche Weise konfigurieren, wie Sie eine AVD auf einem lokalen Host verbinden. Beispiel:
    adb connect localhost:5555
    adb devices
    
    Die Ausgabe sollte lauten:
    List of devices attached
    localhost:5555 device
    

Richten Sie den AAOS-Emulatordienst ein

So richten Sie den Emulatordienst ein:

  1. Installieren Sie das Android-Emulator-Docker-Containerskript:
    git clone https://github.com/google/android-emulator-container-scripts.git
    
    cd android-emulator-container-script
    source ./configure.sh
    
  2. Dadurch wird eine virtuelle Umgebung aktiviert und der ausführbare Emu-Docker verfügbar gemacht. Um detaillierte Informationen zu seiner Verwendung zu erhalten, starten Sie es:
    emu-docker -h
    
  3. Um die Docker-Container zu erstellen, akzeptieren Sie die Lizenzvereinbarungen.
  4. Erstellen Sie den AAOS-Emulator-Docker-Container.
  5. Laden Sie einen Emulator-Build höher als Version 7154743 herunter. Zum Beispiel:
    sdk-repo-linux-emulator-7154743.zip
    
  6. Laden Sie das AAOS-Emulatorsystem-Image herunter. Beispiel: sdk-repo-linux-system-images-7115454.zip :
    emu-docker create <emulator-zip> <system-image-zip>
    
  7. Erstellen Sie die Webcontainer und legen Sie Benutzernamen und Passwort für den Fernzugriff fest.
    ./create_web_container.sh -p user1,passwd1
    
  8. Starten Sie den AAOS-Emulator-Webdienst:
    docker-compose -f js/docker/docker-compose-build.yaml -f js/docker/development.yaml up
    

Sie haben erfolgreich einen AAOS-Emulator-Webdienst gestartet! Verwenden Sie Folgendes, um in einem Webbrowser darauf zuzugreifen:

https://<VM_External__IP>

Fehlerbehebung

Wenn ein Verbindungsfehler zur externen IP der VM auftritt, stellen Sie sicher, dass die VM so eingerichtet ist, dass sie sowohl HTTP- als auch HTTPS-Verkehr zulässt. Um dies zu überprüfen, lesen Sie „Ausführen eines einfachen Apache-Webservers“ .

Richten Sie den Turn-Server ein

Sie können jederzeit Ihren eigenen Turn-Server verwenden. Nachfolgend finden Sie ein Beispiel für eine Google Cloud VM-Instanz.

Hinweis: Damit der Turn-Server auf einer Google Cloud VM-Instanz funktioniert, müssen Sie die VM-Firewallregel so konfigurieren, dass Datenverkehr auf den TCP- und UDP-Ports 3478 und 3479 zugelassen wird.

  1. Installieren Sie den Coturn-Server:
    sudo apt install coturn
    systemctl stop coturn
    echo "TURNSERVER_ENABLED=1"|sudo tee -a /etc/default/coturn
    
  2. Ändern Sie /etc/turnserver.conf , indem Sie die folgenden Zeilen hinzufügen:
    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. Ändern Sie die Docker Compose YAML-Datei so, dass sie die TURN-Konfiguration enthält:
    cd android-emulator-container-script
    nano  js/docker/docker-compose-build.yaml
    
  4. Fügen Sie im Emulatorabschnitt die folgenden zwei Umgebungszeilen hinzu:
         shm_size: 128M
         expose:
           - "8554"
    +    environment:
    +       - TURN=printf $SNIPPET
    
  5. Starten Sie den AAOS-Emulatordienst mit der Turn-Konfiguration neu. Ersetzen Sie unbedingt die IP-Adresse, den Benutzernamen und die Anmeldeinformationen des Turn-Servers unten durch Ihre eigenen:
    export SNIPPET="{\"iceServers\":[{\"urls\":\"turn:35.193.52.134:3478\",\"username\":\"test\",\"credential\":\"test123\"}]}"
    docker-compose -f js/docker/docker-compose-build.yaml up