VAPlayer is an x86_64 system emulator for Android virtualisation, built on a pruned QEMU source tree.
core/— trimmed QEMU tree (upstreamqemu.git) used to build thevaplayer-corebinary.ui/— Qt 6 desktop front-end that drivesvaplayer-coreover QMP. The sidebar exposes V-Flash (inspect / flash an image) and ROM Manager (download, prepare, and inject the ARM bridge). Seeui/README.md.tools/— provisioning tools: fetch and unpack a base Android image, inject ARM translation, and flash images offline. Seetools/README.md.COPYING,COPYING.LIB— GPLv3 / LGPLv2 licenses inherited from QEMU.
The core/ tree is reduced to what x86_64 system emulation needs:
- Only the
x86_64-softmmutarget (target/i386) is kept. - Legacy guest architectures (arm, mips, riscv, ppc, sparc, s390x, hppa, loongarch, hexagon, ...) and their devices are removed.
docs/andtests/are removed; unused subprojects and legacy devices (floppy, IDE, SCSI, legacy NICs) are pruned.- Firmware blobs in
pc-bios/are limited to the x86_64 set.
VirtIO drivers retained: virtio-gpu, virtio-blk, virtio-net,
virtio-snd, virtio-input, virtio-9p.
VirtFS (9p) is enabled so the host-to-guest shared folder works. The core
advertises virtio-9p-pci only when it is built with --enable-virtfs; the
UI checks for the device before adding the shared folder to the command line.
cd core
mkdir -p build && cd build
../configure --target-list=x86_64-softmmu \
--enable-virtfs \
--disable-docs --disable-guest-agent --disable-tools \
--disable-sdl --disable-gtk --disable-vnc --disable-opengl \
--disable-spice --disable-curl --disable-libssh --disable-usb-redir \
--disable-libusb --disable-brlapi --disable-curses --disable-capstone \
--disable-numa --disable-replication
ninjaThe result is build/vaplayer-core. Hardware acceleration is provided by
WHPX (Windows), KVM (Linux) and HVF (macOS), with TCG as the portable
fallback.
The core loads its firmware at runtime, resolving it as a relocated QEMU
does: it looks under <dir-of-binary>/qemu-bundle/<prefix>/share/qemu. A
binary copied away from that layout exits at startup with
qemu: could not load PC BIOS 'bios-256k.bin'
build/qemu-bundle/ already has the right shape, but its entries are
symlinks into the source tree. To move the core somewhere else, copy the
firmware rather than the symlinks:
dest=/path/to/install/bin
mkdir -p "$dest/qemu-bundle/usr/local/share"
install -m 0755 core/build/vaplayer-core "$dest/"
cp -r core/pc-bios "$dest/qemu-bundle/usr/local/share/qemu"The release archive and the CI artifact are laid out this way already.
.github/scripts/stage-core.sh performs the same copy, and
.github/scripts/smoke-core.sh boots a staged core to confirm it can
start a machine.