Build your own cloud emulator  |  Android Open Source Project Skip to main content Docs What's new? Release notes Latest security bulletins Latest Compatibility Definition Document (CDD) Site updates Getting Started About Start Download Builds Test Create Contribute Community Tools, build, and related reference Security Overview Bulletins Features Testing Best Practices Core Topics Architecture Audio Camera Connectivity Data Display Fonts Graphics Interaction Media Performance Permissions Power Runtime Settings Storage Tests Updates Virtualization Compatibility Compatibility Definition Document (CDD) Compatibility Test Suite (CTS) Android Devices Cuttlefish Enterprise TV Automotive Overview Software Defined Vehicle In-vehicle Infotainment Release Details Reference HIDL HAL Trade Federation Security Test Suite Android Code Search / English Deutsch Español – América Latina Français Indonesia Italiano Polski Português – Brasil Tiếng Việt Türkçe Русский עברית العربيّة فارسی हिंदी বাংলা ภาษาไทย 中文 – 简体 中文 – 繁體 日本語 한국어 Sign in Documentation What's New? Getting Started Security Core Topics Compatibility Android Devices Automotive Reference Docs More What's New? Getting Started Security Core Topics Compatibility Android Devices Automotive Reference Android Code Search Overview What's new? What is Android Automotive? Terminology Software defined vehicle Overview Terminology Get started Overview Development environment Local development Cloud development Overview Organization setup Code location Download, build, and run IDE setup Access GitHub repositories Understand AAOS SDV System architecture SDV architecture Key concepts Logical architecture Service bundle naming conventions Configure the Orchestrator Service bundle identity Time sync Health monitoring Quality of service scheduling Control vehicle and power management Security concepts Authorization Overview Deployment Authorization policy Enforcement Debug permissions violations VM-level authorization policy VM identity and attestation Overview SDV profile for DICE vvmconfig and vvmtruststore Mesh status and provisioning Device trust Update concepts Service bundle updates A/B system updates Update Manager OEM AB partition updates Develop SDV services Quick start: Create and execute SDV service bundles Vehicle Services IDL (VSIDL) Overview Define messages and RPC services Define service architecture Generate middleware Implement business logic Build and deploy service bundles Automatic catalog updates and LSP integration Language specification SDV VSIDL compatibility guidelines VSIDL Provider for reflection Service bundle metadata Core code samples Handle suspend and resume Work with Automotive Services Overview Configuration and calibration Diagnostics User preferences architecture and implementation guide Asynchronous Rust Platform integration guides SDV Core integration Integration guide Guest system (VM image) requirements SDV Core bootloader APEX signing SDV Media integration Overview SDV Media requirements Graphics rendering on SDV Media SDV Media: Manage displays Use cameras SDV on hardware SDV on QNX QVM sample configurations QVM sample configuration for SDV Core QVM sample configuration for SDV Media QVM sample configuration for SDV IVI VM identity and attestation SDV bootloader Android HLOS CDI handover Configure identity for native services SOME/IP integration guide Overview Write a SOME/IP mapping file Write a SOME/IP type definition Implement the SOME/IP stack Integrate SOME/IP with SDV Optimize performance Use the SDV Gateway on IVI The Generic Kernel Image (GKI) project Partition layout Test, debug, and verify performance Debug SDV Troubleshoot middleware API failures Use tracing to gain insights into system performance SELinux policies for device tests Detect security violations SDV system tests SDV Test Framework library SDV system test creation Solution guides Display Safety Overview Get started Code structure DriverUI HAR camera view HAR platform abstraction layer HAR graphics pipeline Audio chimes Performance tracing for HAR Safety design toolchain Telemetry Overview SDK Overview Rust telemetry client library Overview Rust telemetry client library API Configurable Publisher Registry library Java protobuf descriptor generator tool Metrics Configuration Generator Overview Deployment Vehicle signal catalogs API reference Metrics configuration concepts Data sources Configurable Publisher Registry Metrics configuration generation request JSON format Cloud Telemetry Simulation Overview Deployment guide User guide In-vehicle Infotainment Overview Guidelines for development Car service feature control App compat Car display compatibility Audio Overview Audio focus Car audio configuration Configurable audio policy engine Audio control HAL Multi-zone audio routing Car audio plugin service Volume management Connect an input device in AAOS Microphone input Audio power management Manage audio resources during suspend Audio configuration AAOS flags Windowing with Scalable UI Overview Implement advanced windowing Consider the app ecosystem Maximize test compliance with WindowManager invariants Configure advanced windowing Configure a panel Configure a variant Configure a transition Configure an event Configure an action Implement heads up notification panels Customize system bars Integrate Setup Wizard Camera Overview Android Camera Service Overview Enable multi-client cameras Extended View System Overview Event and frame notification mechanism Program camera control parameters Changes to camera and system configuration Frame metadata Automotive display proxy service Multi-camera support Vehicle camera HAL Migrate to Camera2 Overview Migrate to Camera2 Camera2 API mapping Car framework core Car Settings Overview Add Car Settings Rearrange Car Settings Distraction optimization in Car Settings Car Settings search indexing Dual pane customization Preference subtitles Customize status bar system icons Connectivity Configure internal Ethernet networks Bluetooth Per-application network selection (PANS) Maintain hotspots between driving sessions Device management for Automotive Displays and input Overview Monitor status Key input Instrument Cluster API OEM custom inputs Multi-Display Communications API Automotive Window Layering Driver distraction Driver distraction guidelines Car User Experience Restrictions rules Consume car driving state and UX restrictions Flash wear management Location Automotive location bypass allowlist policy Automotive Location Bypass API Get coarse location Notifications Overview Set up notifications Heads-up notifications Notification access and notification listener policy Throttle and suppress notifications Performance analysis Power Overview Power policy Power management Manage boot time Garage Mode Radio Overview Broadcast radio HAL Radio control implementation Set up remote access Rotary controller Overview Develop apps Develop apps without the Car UI library Integration guide for OEMs Security Overview Secure developer options Enable MACsec for Ethernet features Debug Restriction Controller integration guide Use vehicle bound file encryption Manufacturer guide for long-term Android security Vehicle system isolation OTA updates System UI Implement the System UI SystemUIOverlayWindow management system SystemUIOverlayWindow codelab Time Overview Configure AAOS time sources Automatic time detection Time zone options Location time zone detection Unbundled apps Overview Release notes Integrate unbundled apps AOSP host integration guide Integrate the AOSP host Media apps with Car App Library OEM design tokens Control Center reference app Overview Customize the reference app Technical details Integrate AppCards Overview Create an AppCard Configure an AppCard host Try the AppCard codelab App Lock Car Messenger Car UI library Overview Integrate the Car UI library into apps Customize apps Car UI plugins List of packages containing car-ui-lib Add custom fonts Customize Car UI preferences Customize the toolbar with runtime resource overlays Customization options for CarUiListItem Customize CarUiRecyclerView Car UI library release notes Appendix A, work with RROs Appendix B, customization Appendix C, minimum compatible version for Car UI Plugin API Dashcam Dialer Overview Technical details Customization guidelines Global configurable values Toolbar Debug and test Media Overview System components and user flows Implement radio with Media Customize media Implement a media card Integrate deep links to Media apps Users and accounts Multi-user support Foreground and background user system handling Manage users and accounts Remove packages for the system user User HAL properties Vehicle hardware abstraction layer (VHAL) Overview VHAL interface Property configurations Supported system properties Special properties SEAT and STEERING_WHEEL properties ADAS vehicle properties Reference implementation Debug VHAL Use VHAL with the native client HIDL VHAL HIDL VHAL migration guide HIDL VHAL interface Virtualization Overview Architecture Tools Reference platform Voice Voice assistant Tap-to-Read OEM custom inputs Voice interaction integration guide About voice interaction Integration flows App development Fulfill commands Test and debug Watchdog Overview Monitor flash memory usage Collect performance data Monitor system health Development tools Overview Android Virtual Device Android Virtual Device as a development platform Build your own cloud emulator Extend VHAL property descriptions in the emulator Emulator USB passthrough integration guide USB Port Reset API Pixel devices as development platforms System performance tools Testing tools and infrastructure Overview System performance tools User interface frameworks Network simulation Complete Automotive Tests in a Box (CATBox) Enable fuzzers Spectatio Torq Release details Overview Android Automotive 26Q2 Android Automotive 25Q4 Android Automotive 25Q2 Android Automotive 25Q1 Android Automotive 24Q4 Android Automotive 15 Android Automotive 14 QPR1 Android Automotive 14 Android Automotive 13 QPR3 Android Automotive 13 QPR2 Android Automotive 13 QPR1 Android Automotive 13 Android Automotive 12L Android Automotive 12 QPR3 Android Automotive 11 Unbundled apps What's new? Release notes Latest security bulletins Latest Compatibility Definition Document (CDD) Site updates Getting Started About Start Download Builds Test Create Contribute Community Tools, build, and related reference Security Overview Bulletins Features Testing Best Practices Core Topics Architecture Audio Camera Connectivity Data Display Fonts Graphics Interaction Media Performance Permissions Power Runtime Settings Storage Tests Updates Virtualization Compatibility Compatibility Definition Document (CDD) Compatibility Test Suite (CTS) Android Devices Cuttlefish Enterprise TV Automotive Overview Software Defined Vehicle In-vehicle Infotainment Release Details Reference HIDL HAL Trade Federation Security Test Suite Effective in 2026, to align with our trunk stable development model and ensure platform stability for the ecosystem, we will publish source code to AOSP in Q2 and Q4. For building and contributing to AOSP, use android-latest-release. The android-latest-release manifest branch will always reference the most recent release pushed to AOSP. For more information, see Changes to AOSP. AOSP Docs Automotive Build your own cloud emulator Stay organized with collections Save and categorize content based on your preferences. This page describes how to run AAOS Emulator as a Web Service and run it in a web browser to make it remotely accessible to users. Doing so provides an end-to-end, minimally viable reference through the Google Cloud Compute Engine. That said, you can use this service on any public or private cloud platform of your choice. Purpose This centralized configuration and setup make AAOS Emulator accessible to an entire company, supplier, and work-from-home developers. Doing so makes it more efficient to manage and upgrade the AAOS Emulator to new versions and eliminates the time needed to set up and manage local machines for individual users. This solution optimizes the use of hardware resources and enables a lower cost app development environment. For example, for purposes of: User research, user experience review, customer support, and training. Demos to potential customers and in sales channels. Test, validate, and even debug apps (including daily OEM HMI builds) at scale. Consider the Emulator a substitute for the test benches use to develop apps. OEM customer call center agents have a uniform, easy-to-access HU UI. The benefits of using the AAOS Emulator are numerous: Use a setup script to create a customized and cloud-based AAOS Emulator (cloud emulator). Build a customized AAOS Cloud Emulator image for VM instances: Ready set-up of a cloud-based emulator. Public AAOS AVD images available to the service creator to start an AAOS AVD with a command. For example, public OEM AVD images as samples for partners to adapt and apply. Architecture The architecture of the cloud emulator example is illustrated below. Your first minimally viable service will work by adding your own OEM AVD images. Figure 1. Cloud AVD architecture. The key emulator building blocks are: Item Purpose Android Emulator Emulator instance hosts AVD images Goldfish-webrtc bridge Linux app to provide communication between the react app and the AAOS Emulator android-emulator-webrtc React app to display the Emulator UI in a web browser. React also captures user input events and sends them back to the server. Android Emulator Container Scripts Python scripts to manage and create Docker images and containers for the above software modules. here. Generates tokens to manage the access permissions of the emulator. Turn server Establishes a WebRTC direct connection between the client and the server. Turn server is required only when the Emulator service is running behind firewalls or proxies. Envoy A proxy service to: Provide HTTPS using a self-signed certificate. Redirect traffic on port 80 (http) to port 443 (https). Act as a gRPC proxy for the emulator. Verify tokens to permit access to the emulator gRPC endpoint. Redirect other requests to the Nginx component, which hosts a React app. Set up emulator on a cloud VM To create a GCP project: Go to the Google Cloud Console and Select a Project. To confirm that billing is enabled for your Google Cloud project, see Enable, disable, or change billing for a project . Enable the API. Create a Linux VM in GCE 1. Enable nested virtualization By default, nested virtualization is allowed at the project, folder, or organization level. Unless someone in your organization has disabled nested virtualization, you needn't do anything to enable it. Use the gcloud command-line tool to confirm that Nested Virtualization is allowed: gcloud beta resource-manager org-policies describe \ constraints/compute.disableNestedVirtualization --effective --project=[PROJECT_ID] 2. Create an Ubuntu-1804-lts bootable disk Go to Cloud Console. Select the GCP project. Go to Navigation menu and select Compute Engine Disks Create Disk. Provide a disk name. For example, ubuntu1804lts Select a Region and Zone. To support Nested Virtualization, make sure the Region and Zone you select support Haswell (or later) processors. To learn more, see Regions and Zones. Select the source image of ubuntu-1804-bionic-v20210211 Set an appropriate disk size (100GB or bigger is recommended). Figure 2. Create Ubuntu bootable disk. 3. Create a custom image with special license key to enable VMX Go to the Cloud Console. Open a Cloud Shell and use the following command: 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" Enter an Image name. For example, aaos-emulator-image Set Disk Zone to the zone in which you created the disk. Set the disk name to the name you used to create the disk. For example: 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" For details, see Nested Virtualization VM Instance. 4. Create a VM instance using the customized image Go to Cloud Console. Select the GCP project. Go to Navigation Menu Compute Engine VM instance. Figure 3. Create a VM instance. Enter an instance name. For example, aaosemulator Select the desired machine family and type. Make sure the machine contains four vCPUs and 16 GB of memory (or more). Select CPU platform to be Intel Cascade Lake (or later). Change the boot disk to the image created in the previous step. Enable Firewall for: Allow HTTP traffic Allow HTTPS traffic 5. Configure firewall to open port 80 and 443 Go to Cloud Console. select the GCP project. Go to Navigation Menu Compute Engine VM instance Set up firewall rule. Install required software on the VM Install Python 3 and Python3-env: sudo apt update sudo apt install python3 sudo apt-get install python3-venv Install Android SDK and ADB available on the path. sudo apt install android-sdk To install Docker and Docker-compose, see Docker and Docker-compose. Make sure you can run these as the non-root user. To confirm the CPU supports hardware virtualization (the command should result in a non-zero number): egrep -c '(vmx|svm)' /proc/cpuinfo Install the Kernel Virtual Machine (KVM). To install KVM, run: sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils To verify KVM is working: sudo apt install cpu-checker kvm-ok The output should be: INFO: /dev/kvm exists KVM acceleration can be used To install Node.js and Node Packet Manager (NPM): sudo apt install nodejs npm Start the hosted containers To verify the installation, run the hosted Android Emulator containers from the public repository. You can find details about the containers here. You can now run these containers without building them. For example: 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 This pulls down the container (if it's not locally available) and launches it. When the container is launched, connect to the device by configuring ADB in the same way as connecting an AVD on a local host. For example: adb connect localhost:5555 adb devices The output should be: List of devices attached localhost:5555 device Set up the AAOS Emulator service To set up the Emulator service: Install the Android Emulator Docker container script: git clone https://github.com/google/android-emulator-container-scripts.git cd android-emulator-container-script source ./configure.sh This activates a virtual environment and makes the executable emu-docker available. To get detailed information about its use, launch it: emu-docker -h To create the Docker containers, accept the license agreements. Build the AAOS Emulator Docker container. Download an emulator build later than version 7154743. For example: sdk-repo-linux-emulator-7154743.zip Download the AAOS emulator system image. For example, sdk-repo-linux-system-images-7115454.zip: emu-docker create <emulator-zip> <system-image-zip> Create the Web Containers and set username and password for remote access. ./create_web_container.sh -p user1,passwd1 Start the AAOS Emulator Web Service: docker-compose -f js/docker/docker-compose-build.yaml -f js/docker/development.yaml up You've successfully started an AAOS Emulator Web Service! Use the following to access it on a web browser: https://<VM_External__IP> Troubleshooting If a connection error to the VM external IP occurs, make sure the VM is set up to allow both HTTP and HTTPS traffic. To validate this, see Running a basic Apache web server. Set up the turn server You can always use your own turn server. Provided below is an sample on a Google Cloud VM instance. Note: To make the turn server work on a Google Cloud VM instance, be sure to configure the VM firewall rule to allow traffic on TCP and UDP ports 3478 and 3479. Install the coturn server: sudo apt install coturn systemctl stop coturn echo "TURNSERVER_ENABLED=1"|sudo tee -a /etc/default/coturn Modify /etc/turnserver.conf by adding the following lines: 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 Modify the Docker Compose YAML file to include the TURN configuration: cd android-emulator-container-script nano js/docker/docker-compose-build.yaml Add the following two environment lines in the emulator section: shm_size: 128M expose: - "8554" + environment: + - TURN=printf $SNIPPET Restart the AAOS Emulator service with the turn configuration. Be sure to replace the turn server IP, username, and credential below with your own: export SNIPPET="{\"iceServers\":[{\"urls\":\"turn:35.193.52.134:3478\",\"username\":\"test\",\"credential\":\"test123\"}]}" docker-compose -f js/docker/docker-compose-build.yaml up Content and code samples on this page are subject to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates. Last updated 2026-06-17 UTC. [[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2026-06-17 UTC."],[],[]] Build Android repository Requirements Downloading Preview binaries Factory images Driver binaries Connect @Android on X @AndroidDev on X Android Blog Google Security Blog Platform on Google Groups Building on Google Groups Porting on Google Groups Get help Android Help Center Pixel Help Center www.android.com Google Mobile Services Stack Overflow Issue Tracker About Android Community Legal License Privacy Site feedback Manage cookies English Deutsch Español – América Latina Français Indonesia Italiano Polski Português – Brasil Tiếng Việt Türkçe Русский עברית العربيّة فارسی हिंदी বাংলা ภาษาไทย 中文 – 简体 中文 – 繁體 日本語 한국어