Erstellen Sie Ihren eigenen Cloud-Emulator

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

Zweck

Diese zentralisierte Konfiguration und Einrichtung machen den AAOS-Emulator für ein ganzes Unternehmen, Lieferanten und Entwickler, die von zu Hause aus arbeiten, zugänglich. Dadurch wird es effizienter, den AAOS-Emulator zu verwalten und auf neue Versionen zu aktualisieren, und es entfällt die Zeit, die zum Einrichten und Verwalten lokaler Computer 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 Zwecke von:

  • Benutzerforschung, Überprüfung der Benutzererfahrung, Kundensupport und Schulung.
  • Demos für potenzielle Kunden und in Vertriebskanälen.
  • Testen, validieren und debuggen Sie Apps (einschließlich täglicher OEM-HMI-Builds) im großen 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 Vorteile der Verwendung des AAOS-Emulators sind zahlreich:

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

Die Architektur

Die Architektur des Cloud-Emulator-Beispiels ist unten dargestellt. Ihr erster minimal funktionsfähiger Dienst funktioniert, indem Sie Ihre eigenen OEM-AVD-Images hinzufügen.

Abbildung 1. Cloud-AVD-Architektur

Die wichtigsten Bausteine ​​des Emulators sind:

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 die Anwendung, um die Emulator-Benutzeroberfläche in einem Webbrowser anzuzeigen. React erfasst auch Benutzereingabeereignisse und sendet sie an den Server zurück.
Android-Emulator-Container-Skripts Python-Skripte zum Verwalten und Erstellen von Docker-Images und -Containern für die oben genannten Softwaremodule.
JWT-Dienst (JSON Web Token-Dienst) Generiert Token, um die Zugriffsberechtigungen des Emulators zu verwalten.
Server drehen 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 Datenverkehr von Port 80 (http) auf Port 443 (https) um.
  • Als gRPC-Proxy für den Emulator fungieren.
  • Überprüfen Sie Token, um den Zugriff auf den gRPC-Endpunkt des Emulators zuzulassen.
  • Leiten Sie andere Anfragen an die Nginx-Komponente um, die eine React-Anwendung hostet.

Emulator auf einer Cloud-VM einrichten

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, siehe 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 verschachtelte Virtualisierung 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-Konsole .
  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 verschachtelte Virtualisierung zu unterstützen, stellen Sie sicher, dass die Region und Zone, die Sie auswählen, Haswell-Prozessoren (oder höher) unterstützen. Weitere Informationen finden Sie unter Regionen und Zonen .
    3. Wählen Sie das Quell-Image von ubuntu-1804-bionic-v20210211
    4. Stellen Sie eine geeignete Festplattengröße ein (100 GB oder mehr werden empfohlen).

Abbildung 1. Bootfähiges Ubuntu-Laufwerk erstellen

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

  1. Gehen Sie zur Cloud-Konsole .
  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. Beispiel: aaos-emulator-image
    • Stellen Sie Disk Zone auf die Zone ein, in der Sie die Disk 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-Konsole .
  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 Typ aus. Stellen Sie sicher, dass die Maschine vier vCPUs und 16 GB Arbeitsspeicher (oder mehr) enthält.
  6. Wählen Sie als CPU-Plattform Intel Cascade Lake (oder höher).
  7. Ändern Sie die Startdiskette in das im vorherigen Schritt erstellte Image.
  8. Firewall aktivieren für:
    • HTTP-Verkehr zulassen
    • HTTPS-Verkehr zulassen

5. Konfigurieren Sie die Firewall, um Port 80 und 443 zu öffnen

  1. Gehen Sie zur Cloud-Konsole .
  2. Wählen Sie das GCP-Projekt aus.
  3. Gehen Sie zu Navigationsmenü > Compute Engine > VM-Instanz > Firewallregel 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 Android SDK und ADB, die im Pfad verfügbar sind.
    sudo apt install android-sdk
    

    Informationen zum Installieren 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 virtuelle Kernel-Maschine (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 lauten:
    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. Zum 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 (falls 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 eine AVD auf einem lokalen Host. 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 Docker-Containerskript des Android-Emulators:
    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 über seine Verwendung zu erhalten, starten Sie es:
    emu-docker -h
    
  3. Akzeptieren Sie die Lizenzvereinbarungen, um die Docker-Container zu erstellen.
  4. Erstellen Sie den AAOS-Emulator-Docker-Container.
  5. Laden Sie einen Emulator-Build nach Version 7154743 herunter. Beispiel:
    sdk-repo-linux-emulator-7154743.zip
    
  6. Laden Sie das AAOS-Emulator-System-Image herunter. Beispiel: sdk-repo-linux-system-images-7115454.zip :
    emu-docker create <emulator-zip> <system-image-zip>
    
  7. Erstellen Sie die Web-Container und legen Sie den Benutzernamen und das 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-Adresse der VM auftritt, stellen Sie sicher, dass die VM so eingerichtet ist, dass sie sowohl HTTP- als auch HTTPS-Datenverkehr zulässt. Um dies zu überprüfen, siehe Ausführen eines einfachen Apache-Webservers .

Richten Sie den Rundenserver ein

Sie können jederzeit Ihren eigenen Turn-Server verwenden. Unten 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. /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 die folgenden zwei Umgebungszeilen im Emulatorabschnitt hinzu:
         shm_size: 128M
         expose:
           - "8554"
    +    environment:
    +       - TURN=printf $SNIPPET
    
  5. Starten Sie den AAOS-Emulatordienst mit der Turn-Konfiguration neu. Stellen Sie sicher, dass Sie die Turn-Server-IP, den Benutzernamen und die Anmeldeinformationen unten durch Ihre eigenen ersetzen:
    export SNIPPET="{\"iceServers\":[{\"urls\":\"turn:35.193.52.134:3478\",\"username\":\"test\",\"credential\":\"test123\"}]}"
    docker-compose -f js/docker/docker-compose-build.yaml up