פיתוח אמולטור של הענן משלכם

בדף הזה נסביר איך להריץ את AAOS Emulator בתור שירות אינטרנט ולהריץ אותו בדפדפן אינטרנט כדי לאפשר למשתמשים לגשת אליו מרחוק. כך תוכלו לקבל הדרכה מקיפה מקצה לקצה באמצעות Compute Engine של Google Cloud. עם זאת, אפשר להשתמש בשירות הזה בכל פלטפורמת ענן ציבורית או פרטית שבחרתם.

המטרה

ההגדרה וההגדרה המרכזיות האלה מאפשרות גישה ל-AAOS Emulator לכל החברה, לספקים ולמפתחים שעובדים מהבית. כך קל יותר לנהל ולשדרג את AAOS Emulator לגרסאות חדשות, ומבטלים את הצורך להגדיר ולנהל מכונות מקומיות למשתמשים ספציפיים. הפתרון הזה מבצע אופטימיזציה של השימוש במשאבי החומרה ומאפשר סביבה לפיתוח אפליקציות בעלות נמוכה יותר. לדוגמה, למטרות:

  • מחקר משתמשים, בדיקת חוויית המשתמש, תמיכת לקוחות והדרכה.
  • הדגמות ללקוחות פוטנציאליים ובערוצי מכירות.
  • בדיקה, אימות ואפילו ניפוי באגים של אפליקציות (כולל גרסאות build יומיות של HMI של יצרן ציוד מקורי) בקנה מידה נרחב. אפשר להתייחס למהדורת ה-Emulator כתחליף למערכות הבדיקה שמשמשות לפיתוח אפליקציות.
  • לנציגי מרכזי השירות של יצרני הציוד המקורי יש ממשק משתמש אחיד וקל לגישה ב-HU.

יש יתרונות רבים לשימוש ב-AAOS Emulator:

  • שימוש בסקריפט הגדרה כדי ליצור AAOS Emulator (מעבדה וירטואלית בענן) בהתאמה אישית שמבוססת על ענן.
  • יוצרים קובץ אימג' מותאם אישית של AAOS Cloud Emulator למכונות וירטואליות:
    • הגדרה מוכנה של אמולטור מבוסס-ענן.
    • קובצי אימג' ציבוריים של AAOS AVD שזמינים לבורא השירות כדי להפעיל AAOS AVD באמצעות פקודה. לדוגמה, קובצי אימג' ציבוריים של AVD של יצרני ציוד מקורי (OEM) כדוגמאות לשותפים שיכולים להתאים אותם ולהחיל אותם.

ארכיטקטורה

הארכיטקטורה של הדוגמה למהדר ענן מופיעה בהמשך. כדי ליצור את השירות הראשון שאפשר להשתמש בו, צריך להוסיף תמונות AVD של יצרן הציוד המקורי (OEM).

איור 1. הארכיטקטורה של Cloud AVD.

אבני הבניין של המהדר הם:

כאן.
פריט המטרה
אמולטור Android מכונות אמולטור שמארחות קובצי אימג' של AVD
גשר Goldfish-webrtc אפליקציית Linux שמספקת תקשורת בין אפליקציית React לבין אמולטור AAOS
android-emulator-webrtc אפליקציית React להצגת ממשק המשתמש של המהדר בדפדפן אינטרנט. ב-React מתועדים גם אירועי קלט של משתמשים, והם נשלחים חזרה לשרת.
סקריפטים של קונטיינרים ב-Android Emulator סקריפטים של Python לניהול וליצירה של קובצי אימג' וקונטיינרים של Docker עבור המודולים של התוכנה שלמעלה.
יצירת אסימונים לניהול הרשאות הגישה של המהדר.
הפעלת השרת יוצר חיבור ישיר של WebRTC בין הלקוח לשרת. צריך להפעיל את השרת רק כששירות המהדמנת פועל מאחורי חומות אש או שרתי proxy.
Envoy

שירות proxy כדי:

  • לספק HTTPS באמצעות אישור עם חתימה עצמית.
  • מפנים את התנועה ביציאה 80 (http) ליציאה 443 (https).
  • לשמש כשרתי proxy של gRPC לאמולטור.
  • אימות האסימונים כדי לאפשר גישה לנקודת הקצה (endpoint) של ה-gRPC במהדורת האפליקציה להדמיה.
  • להפנות בקשות אחרות לרכיב Nginx, שמארח אפליקציית React.

הגדרת אמולטור במכונה וירטואלית בענן

כדי ליצור פרויקט ב-GCP:

  1. נכנסים למסוף Google Cloud ובוחרים פרויקט.
  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. נכנסים למסוף Google Cloud.
  2. בוחרים את הפרויקט ב-GCP.
  3. עוברים לתפריט Navigation ובוחרים באפשרות Compute Engine > Disks > Create Disk.
    1. נותנים שם לדיסק. לדוגמה: ubuntu1804lts
    2. בוחרים אזור ואזור משנה. כדי לתמוך בווירטואליזציה בתצוגת עץ, חשוב לוודא שהאזור והתחום שבוחרים תומכים במעבדים מסוג Haswell (או מאוחר יותר). מידע נוסף זמין במאמר אזורים ותחומים.
    3. בוחרים את קובץ התמונה המקור של ubuntu-1804-bionic-v20210211
    4. מגדירים את גודל הדיסק המתאים (מומלץ להגדיר 100GB או יותר).

איור 2. יצירת דיסק אתחול של Ubuntu.

3. יצירת קובץ אימג' בהתאמה אישית עם מפתח רישיון מיוחד כדי להפעיל את VMX

  1. נכנסים למסוף Cloud.
  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. נכנסים למסוף Google Cloud.
  2. בוחרים את הפרויקט ב-GCP.
  3. עוברים אל Navigation Menu‏ (תפריט הניווט) > Compute Engine‏ (Compute Engine) > VM instance (מכונה וירטואלית).

    איור 3. יוצרים מכונה וירטואלית.

  4. מזינים שם למכונה. לדוגמה: aaosemulator
  5. בוחרים את סוג המכונה ומשפחת המכונות הרצויים. חשוב לוודא שהמכונה מכילה ארבעה מעבדים וירטואליים (vCPU) ו-16GB של זיכרון (או יותר).
  6. בוחרים את פלטפורמת המעבד כ-Intel Cascade Lake (או גרסת מעבד מתקדמת יותר).
  7. מחליפים את דיסק האתחול בקובץ האימג' שנוצר בשלב הקודם.
  8. מפעילים את חומת האש עבור:
    • מתן הרשאה לתנועה מסוג HTTP
    • לאפשר תנועה ב-HTTPS

5. הגדרת חומת האש לפתיחת יציאות 80 ו-443

  1. נכנסים למסוף Google Cloud.
  2. בוחרים את פרויקט GCP.
  3. עוברים אל Navigation Menu‏ > Compute Engine‏ > VM instance‏ > Set up firewall rule.

התקנת התוכנות הנדרשות ב-VM

  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. מתקינים את Kernel Virtual Machine‏ (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 Emulator מהמאגר הציבורי. פרטים על הקונטיינרים זמינים כאן. עכשיו אפשר להריץ את הקונטיינרים האלה בלי ליצור אותם. לדוגמה:
    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 Emulator

כדי להגדיר את השירות של המהדר:

  1. מתקינים את הסקריפט של מאגר Docker של Android Emulator:
    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 Emulator.
  5. מורידים build של אמולטור בגרסה מאוחרת יותר מגרסה 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 Emulator. כדי לגשת אליו בדפדפן אינטרנט:

https://<VM_External__IP>

פתרון בעיות

אם מתרחשת שגיאת חיבור לכתובת ה-IP החיצונית של המכונה הווירטואלית, צריך לוודא שהמכונה הווירטואלית מוגדרת לאפשר גם תעבורת נתונים מסוג HTTP וגם תעבורת נתונים מסוג HTTPS. למידע נוסף, ראו הפעלת שרת אינטרנט בסיסי של Apache.

הגדרת שרת ה-TURN

תמיד אפשר להשתמש בשרת ניתוב קריאות משלכם. בהמשך מופיעה דוגמה למכונה וירטואלית ב-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 Emulator עם הגדרת הפנייה. חשוב להחליף את כתובת ה-IP, שם המשתמש והפרטים האישיים של שרת ה-TURN שבהמשך בפרטים שלכם:
    export SNIPPET="{\"iceServers\":[{\"urls\":\"turn:35.193.52.134:3478\",\"username\":\"test\",\"credential\":\"test123\"}]}"
    docker-compose -f js/docker/docker-compose-build.yaml up