写给 Windows 用户的 AOSP 构建开发环境配置指南

因为忍受不了Ubuntu在4K下的Fractional Scaling体验,最近将开发环境切换到了Windows11,并尝试在Windows11 + WSL2上搭建AOSP编译开发环境,并获得了以下体验

本文标题看起来仅将Windows系统包含在内,如果在Mac中找到WSL2的平等替代(例如:Docker),或者远程服务器替代WSL2的作用,那么本文也会受益于其他系统

Windows11提供了嵌套虚拟化技术,如果是非Windows11不能成功运行Cuttlefish虚拟机,只能获得代码编译,阅读源码的体验,读者如果无需运行Cuttlefish或者拥有Pixel系列真机,则可以使用Windows10系统

WSL2环境安装 (Windows)

*CPU虚拟化是安装的前提环境,可以在任务管理器-性能-CPU查看是否显示虚拟化已启用

*wsl默认会安装到C盘,如果C盘容量不够300G,则自行查阅资料将其迁移到其他符合条件的硬盘

初次使用WSL可以使用wsl --install直接初始化默认安装Ubuntu系统,如果已经安装过其他发行版本,可以使用wsl --list --online + wsl --install -d <DistroName>选择Ubuntu发行版进行安装,安装完成后按照提示配置账号密码进入系统,如有其他问题请参阅官方文档

修改WSL内存和CPU核心

默认情况下Windows给WSL的配置并不是很高,我们可以在C:/Users//目录下创建.wslconfig文件(注意无后缀名,window可能自己添加txt后缀,请注意区分),

 [wsl2]
 processors=8
 memory=16GB
 nestedVirtualization=true

上述核心数和内存大小请按照本机实际情况编写,但是按照Google要求,内存至少为16G,修改成功后在Windwos命令行执行wsl --shutdown以生效,在重启后的Ubuntu命令行执行 free -hcat /proc/cpuinfo| grep "processor"| wc -l分别查看内存和cpu是否符合

修改软件源

配置软件源可以让你更快的下载编译所需的工具,在Ubuntu中使用下面的命令进行软件源的更换

sudo sed -i "s@http://.*archive.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list
sudo sed -i "s@http://.*security.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list

然后运行 sudo apt-get update 更新索引以生效。

AOSP编译环境搭建以及下载源码(Ubuntu)

配置环境

在Ubuntu中执行下述命令以配置搭建环境

sudo apt-get install 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

执行 sudo apt-get install repo来安装Repo工具

执行sudo ln -s /usr/bin/python3 /usr/bin/python将python链接到python3

配置账号

使用下面的命令以配置环境,读者对google的贡献会以以下账号信息提交,Google要求Email信息必须是Google账号。

git config --global user.name Your_Name
git config --global user.email [email protected]

下载源码

因为网络限制,我们如果直接下载Android源码会遇见各种各样的网络问题,即便是我们有一个"通道"能够解决网络问题,但是由于Android源码太大,“通道"流量不够等也会阻碍下载。所以我们要利用好国内的镜像服务,使用镜像下载全量的数据

我们选择使用Tuna镜像站下载AOSP Master源码,以下是详细步骤

  1. 执行export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo',因为repo工具在执行前会先去https://gerrit.googlesource.com/git-repo下载更新,由于网络限制,所以将其更换成Tuna镜像会提高下载速率
  2. 创建存储目录,目录名随意mkdir aosp && cd aosp
  3. 初始化仓库repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest
    1. 上述仓库下载的是master分支,如果你想下载某一特定版本可以根据这份文档传递-b参数指定分支,例如repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-13.0.0_r23
    2. !注意!选择陈旧tag可能不包含下文所述工具链,例如源码导入工具AIDEGen在Android10以上源码才可使用,Cuttlefish可能在旧版本中还未支持等,本文在Master分支测试通过
  4. 执行repo sync -j4,-j4代表了并发数,超过4镜像站会出现503限制
  5. 拉取源码成功

上述操作仅仅是将镜像站的代码拷贝了下来,如果想要给AOSP提交贡献,或者获取今天内的改动,那么镜像站就不那么即时了,如果有这方面的要求可以选择配置代理并设置官方源,这样就建立了和AOSP的交互环境

构建源码(Ubuntu)

以下命令全部在aosp根目录下运行

设置环境

使用envsetup.sh脚本初始化环境:source build/envsetup.sh

该脚本为当前环境注入了工具,编译目录,编译产物等变量,关闭终端后会失效,之后介绍的所有命令都是执行source build/envsetup.sh命令之后,进入aosp目录之后,您应该始终执行一下该脚本

选择目标

执行lunch弹出菜单选择合适的类型

构建

执行m命令构建Android,并等待成功构建,这里会非常慢非常慢…

运行

请确保您的电脑系统是Windwos11,如果非Windows11请忽略本章,并关注下一篇文章源码开发查看环境搭建相关

检查嵌套虚拟化(Ubuntu)

1.请检查 nestedVirtualization=true 是否存在WindowsC:/Users/<Username>/.wslconfig文件中 2.在Ubuntu中使用sudo apt install cpu-checker并使用kvm-ok命令检查是否可用,如果不可用,可能WSL版本或者Windows版本不对。

构建WSL2内核以支持Cuttlefish(Ubuntu)

WSL2-Linux-Kernel是开源的,我们可以很简单的获取他,下面以linux-msft-wsl-5.15.83.1为例,展示构建流程

  1. 配置源码构建环境sudo apt install build-essential flex bison dwarves libssl-dev libelf-dev bc

  2. 创建目录并下载源码 mkdir ~/kernel_wsl && cd ~/kernel_wsl && wget https://github.com/microsoft/WSL2-Linux-Kernel/archive/refs/tags/linux-msft-wsl-5.15.83.1.tar.gz,其他版本请查看WSL2-Linux-Kernel Github Release

  3. 解压并将目录切换到源码目录tar -xvf linux-msft-wsl-5.15.83.1.tar.gz 并进入到解压后的目录cd WSL2-Linux-Kernel-linux-msft-wsl-5.15.83.1/

  4. 使用微软的构建配置cp Microsoft/config-wsl .config

  5. 执行make menuconfig微调参数

    1. 修改Virtualization-> KVM for Intel/ KVM for AMD 两个全部点击M键将其编译成模块

    2. 修改Processor type and features -> Linux guest support -> KVM Guest support 点击Y选中

    3. 修改Device Drivers > VHOST drivers >vhost virtio-vsock driver 点击M将其编译成模块

    4. 使用左右键移动到Save,按照提示保存并最后Exit

  6. 执行make -j8编译内核

  7. 执行sudo make modules_install安装内核模块

  8. 将内核bzImage拷贝到C盘用户目录下和.wslconfig相同位置!别忘记修改! cp arch/x86/boot/bzImage /mnt/c/Users/<username>/bzImage

  9. 在Windows中修改.wslconfig配置内核,最后.wslconfig如下所示,!别忘记修改!

    [wsl2]
    processors=8
    memory=16GB
    nestedVirtualization=true
    kernel=C:\\Users\\<username>\\bzImage
    
  10. 在Windows命令行执行 wsl --shutdown并重启wsl

  11. 在Ubuntu中挂载内核模块sudo modprobe kvmsudo modprobe vhost_vsock以及sudo modprobe kvm_intel

  12. 再次检查kvm-oklsmod,会发现kvm不报错lsmod包含vhost_vsock和kvm即可

运行Cuttlefish

再次将目录切换到aosp目录下,执行source build/envsetup.sh以及lunch aosp_cf_x86_64_phone-userdebug, 然后执行launch_cvd --start_webrtc=true即可开启服务,查看日志在Windwos浏览器输入网址,即可操作Cuttlefish

ADB服务发现

因为Adb服务默认检测5555端口,而Cuttlefish开启的服务不一定是5555, 1.Ubuntu Shell执行adb devices获得port,然后将其转发到5555端口adb forward tcp:5555 tcp:6520,Windows端即可发现服务

2.Ubuntu Shell执行adb devices获得port, 然后在Windows端指定端口adb connect localhost:6520

总结

至此,我们已经成功编译并运行了AOSP,借助Cuttlefish服务,我们使用宿主的浏览器即可操作虚拟机,并且可以使用adb连接服务。限于篇幅,下一篇文章将讲述如何使用AIDEGen将源码导入Windows端的Android Studio,因为Wslg的性能和体验并不能让我们满意,所以将Android Studio跑在WSL2并不是一个明智的选择,况且他的渲染并不好。

#AOSP #WSL2 #Cuttlefish