Mac 下 UTM Arm64 Ubuntu虚拟机编译AOSP 14源码 记录
Mac 安装utm虚拟机 创建一个arm64版本的ubuntu 勾选虚拟化和 Rosetta 模拟x86_64
一路安装
虚拟化引擎选择部分,务必勾选 Apple Virtualization 。如果不勾选此项,那么后续的 Rosetta 是没办法选择的,并且性能是不足以进行系统编译的。
内存,CPU 部分,建议尽量多给一些,这样编译速度更快,但是不一太多,太多会导致宿主机卡顿,这个需要均衡考虑,尤其是宿主机还需要同步执行其他事情的时候。
磁盘部分,建议至少 400GB 以上,如下图:
共享目录部分,如果是编译代码,不建议使用,性能不够,如果是常规的文件共享,问题不大。
如下图:
最终的配置如下:
设置 Rosetta 启用对于 x86_64 架构应用的支持
$ sudo mkdir /media/rosetta
$ sudo mount -t virtiofs rosetta /media/rosetta
$ sudo apt install binfmt-support
# 此命令的是通知操作系统 0x7f 开头的ELF文件委托给 rosetta 进行加载
# 0x7f 开头代表的是 x86_64 的可执行文件, rosetta 会把文件进行动态转译成 ARM64 指令,从而提升执行性能
# 另外注意,rosetta 只支持 x86_64 , 不支持 x86_32 的应用
$ sudo /usr/sbin/update-binfmts --install rosetta /media/rosetta/rosetta \
--magic "\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x3e\x00" \
--mask "\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff" \
--credentials yes --preserve no --fix-binary yes
添加到系统文件加载项,要求系统启动的时候自动加载 rosetta 。
$ sudo apt install vim
$ sudo vim /etc/fstab
在文件尾部新增一行:
rosetta /media/rosetta virtiofs ro,nofail 0 0
修改后的配置文件类似如下:
/etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/vda2 during curtin installation
/dev/disk/by-uuid/c564e919-be8a-40fc-89cf-bba11fbc6c45 / ext4 defaults 0 1
# /boot/efi was on /dev/vda1 during curtin installation
/dev/disk/by-uuid/92AB-2A45 /boot/efi vfat defaults 0 1
/swap.img none swap sw 0 0
rosetta /media/rosetta virtiofs ro,nofail 0 0
执行 df 命令,应该可以看到 rosetta 已经被正常加载,如下:
$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 2.6G 1012K 2.6G 1% /run
/dev/vda2 392G 11G 361G 3% /
tmpfs 13G 0 13G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/vda1 1.1G 6.4M 1.1G 1% /boot/efi
tmpfs 2.6G 4.0K 2.6G 1% /run/user/1000
rosetta 1.9T 1.8T 25G 99% /media/rosetta
配置完成之后,务必重启一次虚拟机,否则大概率虚拟机系统会在运行过程中崩溃。
启用多处理器架构应用安装
$ sudo dpkg --add-architecture amd64
此时注意,默认情况下 ARM 安装包的 APT 服务器是跟 x86 安装包的服务器是不同的,如果执行上述命令后,更新安装源,会报错找不到文件,我们需要手工指定不同架构的安装包搜索服务器。可以参照下面的方式修改 /etc/apt/sources.list 显式声明各个架构的服务器地址,如下:
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy main restricted
deb-src [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy main restricted
## Major bug fix updates produced after the final release of the
## distribution.
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy-updates main restricted
deb-src [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy-updates main restricted
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy universe
deb-src [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy universe
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy-updates universe
deb-src [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy-updates universe
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy multiverse
deb-src [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy multiverse
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy-updates multiverse
deb-src [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy-updates multiverse
## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy-backports main restricted universe multiverse
deb-src [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy-backports main restricted universe multiverse
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy-security main restricted
deb-src [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy-security main restricted
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy-security universe
deb-src [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy-security universe
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy-security multiverse
deb-src [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy-security multiverse
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy main restricted
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy universe
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy-updates universe
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy multiverse
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy-updates multiverse
deb [arch=amd64] http://security.ubuntu.com/ubuntu jammy-security main restricted
deb [arch=amd64] http://security.ubuntu.com/ubuntu jammy-security universe
deb [arch=amd64] http://security.ubuntu.com/ubuntu jammy-security multiverse
更新源
$ sudo apt update
$ sudo apt dist-upgrade
$ sudo apt autoremove
至此,我们已经可以在 ARM64 环境下,正常安装并运行 x86_64 的应用,只是安装应用的时候,需要明确指定安装包的处理器架构。
安装编译依赖
# 此处需要明确架构为 x86_64 架构,否则默认安装 ARM 架构的应用,我们编译需要使用 x86_64 架构的编译工具
$ sudo apt install gcc:amd64
# 解决
# prebuilts/clang/host/linux-x86/clang-3289846/bin/clang.real: error while loadin
g shared libraries: libncurses.so.5: cannot open shared object file: No such fi
le or directory
$ sudo apt install libncurses5:amd64
# repo、git、ccache 这些工具,使用ARM64版本即可
$ sudo apt install repo ccache zip unzip
$ sudo apt install git
$ git config --global user.email "user@email.com"
$ git config --global user.name "user"
$ sudo apt autoremove
编译完一次后再次编译可能报AOT 错误 解决办法
sudo rm -rf /var/cache/prlrosettad/*` 根本无法清除缓存,我不得不先执行 `sudo -i`,然后 `rm -rf /var/cache/prlrosettad/*`,最后 `exit` 回到我的用户。
安装依赖:
sudo apt install bison java异常
sudo apt install fontconfig:amd64 libfreetype6:amd64 字体库
sudo apt install fonts-dejavu-core:amd64 fonts-dejavu-extra:amd64
报错
Aborted (core dumped) ERROR: Dex2oat failed to compile a boot image.It is likely that the boot classpath is inconsistent.Rebuild with ART_BOOT_IMAGE_EXTRA_ARGS="--runtime-arg -verbose:verifler" to see verificat ion errors.
解决方法:
在build/core/board_config.mkbuild/core/board_config.mk中设置WITH_DEXPREOPT为 false
build/core/dex_preopt_config.mk通过删除build/core/dex_preopt_config.mk来消除错误$(call pretty-error, DEXPREOPT must be enabled for user and userdebug builds)
参考链接:https://stackoverflow.com/questions/76947159/aosp-error-dex2oat-failed-to-compile-a-boot-image-it-is-likely-that-the-boot-cl