สร้าง Cloud Emulator ของคุณเอง

บทความนี้อธิบายวิธีเรียกใช้ AAOS Emulator เป็นบริการบนเว็บและเรียกใช้ในเว็บเบราว์เซอร์เพื่อให้ผู้ใช้สามารถเข้าถึงได้จากระยะไกล การทำเช่นนี้จะให้การอ้างอิงตั้งแต่ต้นทางถึงปลายทางและใช้งานได้น้อยที่สุดผ่าน Google Cloud Compute Engine อย่างไรก็ตาม คุณสามารถใช้บริการนี้บนแพลตฟอร์มคลาวด์สาธารณะหรือส่วนตัวที่คุณเลือกได้

วัตถุประสงค์

การกำหนดค่าและการตั้งค่าแบบรวมศูนย์นี้ทำให้ทั้งบริษัท ซัพพลายเออร์ และนักพัฒนาที่ทำงานจากที่บ้านสามารถเข้าถึง AAOS Emulator ได้ การทำเช่นนี้ทำให้มีประสิทธิภาพมากขึ้นในการจัดการและอัปเกรด AAOS Emulator เป็นเวอร์ชันใหม่ และลดเวลาที่จำเป็นในการตั้งค่าและจัดการเครื่องภายในสำหรับผู้ใช้แต่ละราย โซลูชันนี้เพิ่มประสิทธิภาพการใช้ทรัพยากรฮาร์ดแวร์และช่วยให้สภาพแวดล้อมการพัฒนาแอปมีต้นทุนต่ำลง ตัวอย่างเช่น เพื่อวัตถุประสงค์ของ:

  • การวิจัยผู้ใช้ การตรวจสอบประสบการณ์ผู้ใช้ การสนับสนุนลูกค้า และการฝึกอบรม
  • การสาธิตแก่ผู้มีโอกาสเป็นลูกค้าและช่องทางการขาย
  • ทดสอบ ตรวจสอบ และแม้แต่แก้ไขข้อบกพร่องของแอป (รวมถึงการสร้าง OEM HMI รายวัน) ในวงกว้าง พิจารณาให้ Emulator ทดแทนม้านั่งทดสอบที่ใช้ในการพัฒนาแอป
  • เจ้าหน้าที่ศูนย์บริการลูกค้า OEM มี HU UI ที่เหมือนกันและเข้าถึงได้ง่าย

ประโยชน์ของการใช้ AAOS Emulator มีมากมาย:

  • ใช้สคริปต์การตั้งค่าเพื่อสร้าง AAOS Emulator (โปรแกรมจำลองคลาวด์) ที่ปรับแต่งตามระบบคลาวด์
  • สร้างอิมเมจ AAOS Cloud Emulator แบบกำหนดเองสำหรับอินสแตนซ์ VM:
    • พร้อมตั้งค่าโปรแกรมจำลองบนคลาวด์
    • ผู้สร้างบริการมีอิมเมจ AAOS AVD สาธารณะเพื่อเริ่ม AAOS AVD ด้วยคำสั่ง ตัวอย่างเช่น อิมเมจ OEM AVD สาธารณะเป็นตัวอย่างให้พันธมิตรนำไปปรับใช้

สถาปัตยกรรม

สถาปัตยกรรมของตัวอย่างโปรแกรมจำลองระบบคลาวด์แสดงไว้ด้านล่าง บริการที่มีประสิทธิภาพขั้นต่ำบริการแรกของคุณจะทำงานโดยการเพิ่มอิมเมจ OEM AVD ของคุณเอง

รูปที่ 1 สถาปัตยกรรม Cloud AVD

หน่วยการสร้างโปรแกรมจำลองที่สำคัญคือ:

ที่นี่ .
รายการ วัตถุประสงค์
หุ่นยนต์จำลอง อินสแตนซ์ Emulator โฮสต์อิมเมจ AVD
สะพานปลาทอง-เว็บอาร์ทีซี แอปพลิเคชัน Linux เพื่อให้การสื่อสารระหว่างแอปโต้ตอบและ AAOS Emulator
android-emulator-webrtc โต้ตอบ แอปพลิเคชันเพื่อแสดง Emulator UI ในเว็บเบราว์เซอร์ React ยังจับเหตุการณ์อินพุตของผู้ใช้และส่งกลับไปยังเซิร์ฟเวอร์
สคริปต์คอนเทนเนอร์ตัวจำลอง Android สคริปต์ Python เพื่อจัดการและสร้างอิมเมจ Docker และคอนเทนเนอร์สำหรับโมดูลซอฟต์แวร์ข้างต้น
สร้างโทเค็นเพื่อจัดการสิทธิ์การเข้าถึงของโปรแกรมจำลอง
เปิดเซิร์ฟเวอร์ สร้างการเชื่อมต่อโดยตรงของ WebRTC ระหว่างไคลเอนต์และเซิร์ฟเวอร์ ต้องใช้เซิร์ฟเวอร์ Turn เฉพาะเมื่อบริการ Emulator ทำงานอยู่หลังไฟร์วอลล์หรือพรอกซี
ทูต

บริการพร็อกซีไปที่:

  • จัดเตรียม HTTPS โดยใช้ใบรับรองที่ลงนามด้วยตนเอง
  • เปลี่ยนเส้นทางการรับส่งข้อมูลบนพอร์ต 80 (http) ไปยังพอร์ต 443 (https)
  • ทำหน้าที่เป็นพร็อกซี gRPC สำหรับโปรแกรมจำลอง
  • ตรวจสอบโทเค็นเพื่ออนุญาตการเข้าถึงปลายทาง gRPC ของโปรแกรมจำลอง
  • เปลี่ยนเส้นทางคำขออื่นๆ ไปยังองค์ประกอบ Nginx ซึ่งโฮสต์แอปพลิเคชัน React

ตั้งค่าโปรแกรมจำลองบน Cloud VM

หากต้องการสร้างโครงการ GCP ให้ทำดังนี้

  1. ไปที่ Google Cloud Console แล้ว เลือกโปรเจ็กต์
  2. เพื่อยืนยันว่ามีการเปิดใช้การเรียกเก็บเงินสำหรับโครงการ Google Cloud ของคุณ โปรดดู เปิดใช้งาน ปิดใช้ หรือเปลี่ยนแปลงการเรียกเก็บเงินสำหรับโครงการ
  3. เปิดใช้งาน API

สร้าง Linux VM ใน GCE

1. เปิดใช้งานการจำลองเสมือนแบบซ้อน

ตามค่าเริ่มต้น การจำลองเสมือนแบบซ้อนจะได้รับอนุญาตในระดับโปรเจ็กต์ โฟลเดอร์ หรือองค์กร คุณไม่จำเป็นต้องดำเนินการใดๆ เพื่อ เปิดใช้งาน ยกเว้นในกรณีที่มีคนในองค์กรของคุณได้ปิด ใช้งานการจำลองเสมือนแบบซ้อนกัน

  1. ใช้ เครื่องมือบรรทัดคำสั่ง gcloud เพื่อยืนยันว่าอนุญาตให้ใช้ Nested Virtualization:
    gcloud beta resource-manager org-policies describe   \
      constraints/compute.disableNestedVirtualization  --effective --project=[PROJECT_ID]
    

2. สร้างดิสก์ที่สามารถบูตได้ Ubuntu-1804-lts

  1. ไปที่ คลาวด์คอนโซล
  2. เลือกโปรเจ็กต์ GCP
  3. ไปที่เมนูการนำทาง > Compute Engine > ดิสก์ > สร้างดิสก์
    1. ระบุชื่อดิสก์ ตัวอย่างเช่น ubuntu1804lts
    2. เลือกภูมิภาคและโซน หากต้องการรองรับ Nested Virtualization ตรวจสอบให้แน่ใจว่าภูมิภาคและโซนที่คุณเลือกรองรับโปรเซสเซอร์ Haswell (หรือใหม่กว่า) หากต้องการเรียนรู้เพิ่มเติม โปรดดูที่ ภูมิภาคและโซน
    3. เลือกอิมเมจต้นฉบับของ ubuntu-1804-bionic-v20210211
    4. ตั้งค่าขนาดดิสก์ที่เหมาะสม (แนะนำ 100GB หรือใหญ่กว่า)

รูปที่ 1 สร้างดิสก์ที่สามารถบู๊ตได้ของ Ubuntu

3. สร้างอิมเมจที่กำหนดเองพร้อมรหัสลิขสิทธิ์พิเศษเพื่อเปิดใช้งาน VMX

  1. ไปที่ คลาวด์คอนโซล
  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"
    

สำหรับรายละเอียด โปรดดูที่ Nested Virtualization VM Instance

4. สร้างอินสแตนซ์ VM โดยใช้อิมเมจที่ปรับแต่งเอง

  1. ไปที่ คลาวด์คอนโซล
  2. เลือกโปรเจ็กต์ GCP
  3. ไปที่เมนูการนำทาง > Compute Engine > อินสแตนซ์ VM

    รูปที่ 1 สร้างอินสแตนซ์ VM

  4. ป้อนชื่ออินสแตนซ์ ตัวอย่างเช่น aaosemulator
  5. เลือกตระกูลเครื่องและประเภทที่ต้องการ ตรวจสอบให้แน่ใจว่าเครื่องมี vCPU สี่ตัวและหน่วยความจำ 16 GB (หรือมากกว่า)
  6. เลือกแพลตฟอร์ม CPU ให้เป็น Intel Cascade Lake (หรือใหม่กว่า)
  7. เปลี่ยนดิสก์สำหรับบูตเป็นอิมเมจที่สร้างในขั้นตอนก่อนหน้า
  8. เปิดใช้งานไฟร์วอลล์สำหรับ:
    • อนุญาตการรับส่งข้อมูล HTTP
    • อนุญาตการรับส่งข้อมูล HTTPS

5. กำหนดค่าไฟร์วอลล์เพื่อเปิดพอร์ต 80 และ 443

  1. ไปที่ คลาวด์คอนโซล
  2. เลือกโครงการ GCP
  3. ไปที่เมนูนำทาง > Compute Engine > อินสแตนซ์ VM > ตั้งค่ากฎไฟร์วอลล์

ติดตั้งซอฟต์แวร์ที่จำเป็นบน 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 ตรวจสอบให้แน่ใจว่าคุณสามารถเรียกใช้สิ่งเหล่านี้ในฐานะ ผู้ใช้ที่ไม่ใช่รูท

  3. เพื่อยืนยันว่า CPU รองรับการจำลองเสมือนสำหรับฮาร์ดแวร์ (คำสั่งควรส่งผลให้ตัวเลขไม่เป็นศูนย์):
    egrep -c '(vmx|svm)' /proc/cpuinfo
    
  4. ติดตั้งเคอร์เนลเครื่องเสมือน (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

ในการตั้งค่าบริการ Emulator:

  1. ติดตั้งสคริปต์คอนเทนเนอร์ Android Emulator Docker:
    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. สร้างคอนเทนเนอร์ AAOS Emulator Docker
  5. ดาวน์โหลดรุ่นจำลองที่ใหม่กว่าเวอร์ชัน 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. สร้าง Web Containers และตั้งชื่อผู้ใช้และรหัสผ่านสำหรับการเข้าถึงระยะไกล
    ./create_web_container.sh -p user1,passwd1
    
  8. เริ่มบริการเว็บ AAOS Emulator:
    docker-compose -f js/docker/docker-compose-build.yaml -f js/docker/development.yaml up
    

คุณเริ่มต้นบริการเว็บ AAOS Emulator สำเร็จแล้ว! ใช้สิ่งต่อไปนี้เพื่อเข้าถึงบนเว็บเบราว์เซอร์:

https://<VM_External__IP>

การแก้ไขปัญหา

หากเกิดข้อผิดพลาดในการเชื่อมต่อกับ VM ภายนอก IP ตรวจสอบให้แน่ใจว่า VM ได้รับการตั้งค่าให้อนุญาตทั้งการรับส่งข้อมูล HTTP และ HTTPS หากต้องการตรวจสอบสิ่งนี้ โปรดดูที่ การเรียกใช้เว็บเซิร์ฟเวอร์ Apache พื้นฐาน

ตั้งค่าเทิร์นเซิร์ฟเวอร์

คุณสามารถใช้เทิร์นเซิร์ฟเวอร์ของคุณเองได้ตลอดเวลา ด้านล่างนี้คือตัวอย่างบนอินสแตนซ์ Google Cloud VM

หมายเหตุ: หากต้องการให้เทิร์นเซิร์ฟเวอร์ทำงานบนอินสแตนซ์ Google Cloud VM อย่าลืมกำหนดค่ากฎไฟร์วอลล์ VM เพื่ออนุญาตการรับส่งข้อมูลบนพอร์ต 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. แก้ไขไฟล์ Docker Compose YAML เพื่อรวมการกำหนดค่า 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 เซิร์ฟเวอร์เทิร์น ชื่อผู้ใช้ และข้อมูลประจำตัวด้านล่างด้วยของคุณเอง:
    export SNIPPET="{\"iceServers\":[{\"urls\":\"turn:35.193.52.134:3478\",\"username\":\"test\",\"credential\":\"test123\"}]}"
    docker-compose -f js/docker/docker-compose-build.yaml up