How to Build/Run Cuttlefish on PC/ARM64
9/23, 2019
9/23, 2019
Cuttlefish is new virtual-machine based Android emulator. It uses virtio devices instead of emulated devices as in original Android emulator. As such, it needs lighter VM support (to the extent it can run on ARM64 host), unlike Android Emulator which requires heavily modified QEMU to emulate various devices. The virtio architecture can potentially offer better performance as well.
Refer to a slide deck on cuttlefish. Or find a local copy of it at here.
Many thanks to Alistair
My host Ubuntu 18.04. Refer to https://source.android.com/setup/build/building
git clone https://github.com/google/android-cuttlefish.gitcd android-cuttlefishdpkg-buildpackage --no-signdpkg -i ../cuttlefish-common_0.9.9_amd64.deb/etc/init.d/cuttlefish-common statusrepo init -u https://android.googlesource.com/platform/manifest -b pie-gsisource build.env/lunch aosp_cf_x86_64_phone-userdebugmakesudo usermod -aG kvm $USERsudo usermod -aG cvdnetwork $USERlaunch_cvdsudo apt install openjdk-11-jrejava -jar tightvnc-jviewer.jar #use 127.0.0.1:6444stop_cvd to kill the cvdMy ARM64 board is rockpro64, running ubuntu 18.04.
lunch aosp_cf_arm64_phone-userdebugmake distNote the following output files, which need to be copied to ARM64 host
out/dist/aosp_cf_arm64_phone-img-eng.jsun.zipout/dist/cvd-host_package.tar.gzYou will need CONFIG_BINFMT_MISC. Otherwise below step will fail. Check /proc/sys/fs/binfmt_misc to be sure.
In addition, you will need a few other kernel configs, which according to Alistair are only supported in kernel after 4.9. Here is the set of configs I added to rockpro64 default v5.2 kernel.
CONFIG_BINFMT_MISC=yCONFIG_EVENTFD=yCONFIG_VSOCKETS=yCONFIG_VHOST_NET=mCONFIG_VHOST_SCSI=mCONFIG_VHOST_VSOCK=mCONFIG_VHOST=mCONFIG_VIRTIO_BLK_SCSI=mCONFIG_VIRTIO_INPUT=mCONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=yCONFIG_VIRTIO_VSOCKETS_COMMON=mCONFIG_VIRTIO_VSOCKETS=mCONFIG_VIRT_TO_BUS=yCONFIG_VIRT_WIFI=mIn specific, here are the exact commands I used to build my rockpro64 kernel on my PC ubuntu:
git clone https://github.com/ayufan-rock64/linux-mainline-kernel.gitcd linux-mainline-kernel/git checkout -b 5.2.0-1116-ayufan-js 5.2.0-1116-ayufanvi arch/arm64/configs/rockchip_linux_defconfig # add the above configs to the endvi dev.mk # BUG? change HOSTCC=aarch64-linux-gnu-gcc to HOSTCC=gcc./dev-make kernel-image-and-modules./dev-make kernel-packageCopy over the .deb package file to arm64 host and install with "dpkg -i <pkg file>" command. Reboot afterwards.
Do following as root user:
apt install qemu-user-staticdpkg --add-architecture amd64[You may need to correct /etc/apt/source.list file here. See an example at this link]apt install libc6:amd64After this you should be able to run simple x86_64 binaries such as "cat". Give it a try.
This is similar to x86_64 case, except that you do this step on ARM64 host.
The following packages are needed before you can install cuttlefish-common:
apt install bridge-utils libarchive-tools libfdt1 python iptablesout/dist/aosp_cf_arm64_phone-img-eng.jsun.zipout/dist/cvd-host_package.tar.gzsudo usermod -aG kvm $USERsudo usermod -aG cvdnetwork $USERexport ANDROID_PRODUCT_OUT=/home/jsun/work/cuttlefish/img/export ANDROID_HOST_OUT=/home/jsun/work/cuttlefish/host/export PATH=$PATH:$ANDROID_HOST_OUT/binlaunch_cvd -decompress_kernel=trueMany ARM64 ubuntu distros are minimal or server, which means no desktop included. It is easy to install one. However, without a few key steps (see first a few commands below), you can easily get some headaches.
Below are the commands I used to install Xubuntu on rockpro64, starting from their minimal Ubuntu 18.04 distro.
dd if=./bionic-minimal-rockpro64-0.8.3-1141-arm64.img of=/dev/sdb bs=4Msudo sulocale-genlocalectl set-locale LANG="en_US.UTF-8"apt updateapt install -y xubuntu-desktop