Update ScreenConnector interface to set callback once ... instead of on a per frame basis. With multi-display, ScreenConnector would frequently miss and drop frames from not setting the callback in time. Note that this slightly changes the behavior of Crosvm and the VNC streaming server (*not WebRTC*) when there is no client connection. - Prior to this change, Crosvm's Wayland display would continuously send frames to Cuttlefish's Wayland server (which runs inside of the VNC streaming server). When no clients are connected, the ScreenConnectorQueue becomes full after 2 frames and the AndroidFrameFetchingLoop() thread becomes blocked waiting for the ScreenConnectorQueue to not be full. The AndroidFrameFetchingLoop() would not re-configure the OnNextFrame() callback and the excess frames would be dropped in Cuttlefish's Wayland server. - After this change, Crosvm's Wayland display will not continuously send frames to Cuttlefish's Wayland server (which runs inside of the VNC streaming server). When no clients are connected, the ScreenConnectorQueue becomes full after 2 frames and the *Wayland server's thread* becomes blocked waiting for the ScreenConnectorQueue to not be full while trying to run the process frame callback. This is still okay as Crosvm's Wayland display sees that Cuttlefish's Wayland server has not finished using any buffers and drops the next frame. This doesn't change what VNC clients see but wanted to call it out. Also note that VNC clients see very old frames when a user finally connects both before and after this change - this is problematic as a VNC client will see a boot animation frame if they connect to VNC after the device has reached a steady state and isn't producing new frames. This doesn't change behavior when running with WebRTC as the WebRTC server continues to process frames even when a client is not connected. Cherry-picks aosp/1690948 Bug: b/186633303 Bug: b/193657706 Test: launch Cuttlefish and start webrtc Test: launch Cuttlefish and start vnc Change-Id: I03e5f11d8647f1f035b8dcb03481751a82826d50 Merged-In: I03e5f11d8647f1f035b8dcb03481751a82826d50
Make sure virtualization with KVM is available.
grep -c -w "vmx\|svm" /proc/cpuinfo
This should return a non-zero value. If running on a cloud machine, this may take cloud-vendor-specific steps to enable. For Google Compute Engine specifically, see the GCE guide.
Download, build, and install the host debian package:
git clone https://github.com/google/android-cuttlefish cd android-cuttlefish debuild -i -us -uc -b sudo dpkg -i ../cuttlefish-common_*_amd64.deb || sudo apt-get install -f sudo reboot
The reboot will trigger installing additional kernel modules and applying udev rules.
Go to http://ci.android.com/
Enter a branch name. Start with aosp-master if you don‘t know what you’re looking for
Navigate to aosp_cf_x86_64_phone and click on userdebug for the latest build
Click on Artifacts
Scroll down to the OTA images. These packages look like aosp_cf_x86_64_phone-img-xxxxxx.zip -- it will always have img in the name. Download this file
Scroll down to cvd-host_package.tar.gz. You should always download a host package from the same build as your images.
On your local system, combine the packages:
mkdir cf cd cf tar xvf /path/to/cvd-host_package.tar.gz unzip /path/to/aosp_cf_x86_64_phone-img-xxxxxx.zip
Launch cuttlefish with:
$ HOME=$PWD ./bin/launch_cvd
$ HOME=$PWD ./bin/stop_cvd
You can use adb to debug it, just like a physical device:
$ ./bin/adb -e shell
When launching with ---start_webrtc (the default), you can see a list of all available devices at https://localhost:8443 . For more information, see the WebRTC on Cuttlefish documentation.
When launching with --start_vnc_server=true , You can use the TightVNC JViewer. Once you have downloaded the TightVNC Java Viewer JAR in a ZIP archive, run it with
$ java -jar tightvnc-jviewer.jar -ScalingFactor=50 -Tunneling=no -host=localhost -port=6444
Click “Connect” and you should see a lock screen!