在QEMU模拟的树莓派OS中编译Android Cuttlefish时执行二进制文件报错
解决Arm64树莓派OS虚拟机中Android Cuttlefish编译的二进制格式错误问题
问题场景
在Ubuntu 24.04 x64系统上,通过QEMU模拟Arm64架构的Debian Bookworm树莓派OS,尝试编译并启动Android 13 Cuttlefish。使用的QEMU启动参数:
qemu-system-aarch64 -machine virt-9.0,virtualization=on,gic_version=3 -cpu max \ -smp 8 -m 8G -kernel /mnt/zroot-133/zroot-133/A_FILES/OS/Linux/RaspiOS/Image \ -append "root=/dev/vda2 rootfstype=ext4 rw panic=0 console=ttyAMA0 kvm-arm.mode=nested" \ -drive format=raw,file=/mnt/zroot-133/zroot-133/A_FILES/OS/Linux/RaspiOS/2024-07-04-raspios-bookworm-arm64-big.img,if=none,id=hd0 \ -device virtio-blk,drive=hd0,bootindex=0 \ -netdev tap,id=mynet0,ifname=tap0,script=no,downscript=no \ -device virtio-net-pci,netdev=mynet0,mac=52:55:00:d1:55:01 -device usb-ehci \ -device usb-kbd -device virtio-tablet-pci -usb -device virtio-serial-pci \ -spice port=5930,disable-ticketing=on \ -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 \ -chardev spicevmc,id=spicechannel0,name=vdagent -display spice-app &
参考Android 12的教程调整后,在主机上执行了同步命令:
repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r6 repo sync -c source build/envsetup.sh lunch aosp_cf_arm64_phone-userdebug m
将编译目录挂载到树莓派OS虚拟机内,执行以下命令时出错:
pi@raspberrypi:/mnt/droplet/mnt/zroot-133/zroot-133/A_FILES/OS/Android/2net-co-uk/aosp_cf_arm64_phone-userdebug $ source build/envsetup pi@raspberrypi:/mnt/droplet/mnt/zroot-133/zroot-133/A_FILES/OS/Android/2net-co-uk/aosp_cf_arm64_phone-userdebug $ lunch aosp_cf_arm64_phone-userdebug
错误信息:
/mnt/droplet/mnt/zroot-133/zroot-133/A_FILES/OS/Android/2net-co-uk/aosp_cf_arm64_phone-userdebug/build/blueprint/microfactory/microfactory.bash: riga 62: /mnt/droplet/mnt/zroot-133/zroot-133/A_FILES/OS/Android/2net-co-uk/aosp_cf_arm64_phone-userdebug/out/microfactory_Linux: cannot execute binary file: exe Format not valid
已确认虚拟机为Arm64架构:
pi@raspberrypi:/mnt/droplet/mnt/zroot-133/zroot-133/A_FILES/OS/Android/2net-co-uk/aosp_cf_arm64_phone-userdebug/out/target/product $ ls vsoc_arm64
问题原因
microfactory_Linux是在x64主机上编译生成的x86_64架构二进制文件,无法在Arm64架构的树莓派OS虚拟机中运行。Android编译过程中会先构建microfactory这类辅助工具,这些工具的架构与编译主机一致,而非目标架构。
解决方案
1. 清理主机生成的x86架构文件
在虚拟机内的Android源码目录中,清理所有主机生成的文件:
cd /mnt/droplet/mnt/zroot-133/zroot-133/A_FILES/OS/Android/2net-co-uk/aosp_cf_arm64_phone-userdebug make clean rm -rf out/
2. 在Arm64虚拟机内完整编译
先安装Android 13编译所需的依赖:
sudo apt update sudo apt install openjdk-11-jdk git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
再重新执行编译流程:
source build/envsetup.sh lunch aosp_cf_arm64_phone-userdebug m -j$(nproc)
3. 确认QEMU嵌套虚拟化正常工作
Cuttlefish依赖KVM,检查虚拟机内是否启用嵌套虚拟化:
grep -c kvm /proc/cpuinfo
输出大于0则表示KVM已启用。若未生效,需确认QEMU启动参数中的kvm-arm.mode=nested配置正确,且主机CPU支持ARM嵌套虚拟化(如AMD Ryzen 5000+/Intel 11代及以上)。
4. 启动Cuttlefish
编译完成后,执行以下命令启动:
launch_cvd
内容的提问来源于stack exchange,提问作者mister_smith
相关产品推荐
相关产品推荐

