写给 Windows 用户的 AOSP 构建开发环境配置指南
因为忍受不了Ubuntu在4K下的Fractional Scaling
体验,最近将开发环境切换到了Windows11,并尝试在Windows11 + WSL2上搭建AOSP编译开发环境,并获得了以下体验
- 成功编译AOSP
- 源码导入Source Insight
- Cuttlefish成功运行编译镜像
- 源码导入宿主Android Studio并能够单步调试
本文标题看起来仅将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 -h
和 cat /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源码,以下是详细步骤
- 执行
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
,因为repo工具在执行前会先去https://gerrit.googlesource.com/git-repo
下载更新,由于网络限制,所以将其更换成Tuna镜像会提高下载速率 - 创建存储目录,目录名随意
mkdir aosp && cd aosp
- 初始化仓库
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest
- 上述仓库下载的是master分支,如果你想下载某一特定版本可以根据这份文档传递
-b
参数指定分支,例如repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-13.0.0_r23
- !注意!选择陈旧tag可能不包含下文所述工具链,例如源码导入工具AIDEGen在Android10以上源码才可使用,Cuttlefish可能在旧版本中还未支持等,本文在Master分支测试通过
- 上述仓库下载的是master分支,如果你想下载某一特定版本可以根据这份文档传递
- 执行
repo sync -j4
,-j4代表了并发数,超过4镜像站会出现503限制 - 拉取源码成功
上述操作仅仅是将镜像站的代码拷贝了下来,如果想要给AOSP提交贡献,或者获取今天内的改动,那么镜像站就不那么即时了,如果有这方面的要求可以选择配置代理并设置官方源,这样就建立了和AOSP的交互环境
构建源码(Ubuntu)
以下命令全部在aosp根目录下运行
设置环境
使用envsetup.sh脚本初始化环境:source build/envsetup.sh
该脚本为当前环境注入了工具,编译目录,编译产物等变量,关闭终端后会失效,之后介绍的所有命令都是执行
source build/envsetup.sh
命令之后,进入aosp目录之后,您应该始终执行一下该脚本
选择目标
执行lunch
弹出菜单选择合适的类型
如果是跟随本教程运行虚拟机,请选择
lunch aosp_cf_x86_64_phone-userdebug
类型,其中cf就代表Cuttlefish,说明本次构建的产物是专门给Cuttlefish来使用的
构建
执行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为例,展示构建流程
配置源码构建环境
sudo apt install build-essential flex bison dwarves libssl-dev libelf-dev bc
创建目录并下载源码
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解压并将目录切换到源码目录
tar -xvf linux-msft-wsl-5.15.83.1.tar.gz
并进入到解压后的目录cd WSL2-Linux-Kernel-linux-msft-wsl-5.15.83.1/
使用微软的构建配置
cp Microsoft/config-wsl .config
执行
make menuconfig
微调参数修改Virtualization-> KVM for Intel/ KVM for AMD 两个全部点击M键将其编译成模块
修改Processor type and features -> Linux guest support -> KVM Guest support 点击Y选中
修改Device Drivers > VHOST drivers >vhost virtio-vsock driver 点击M将其编译成模块
使用左右键移动到Save,按照提示保存并最后Exit
执行
make -j8
编译内核执行
sudo make modules_install
安装内核模块将内核bzImage拷贝到C盘用户目录下和.wslconfig相同位置!别忘记修改!
cp arch/x86/boot/bzImage /mnt/c/Users/<username>/bzImage
在Windows中修改.wslconfig配置内核,最后.wslconfig如下所示,!别忘记修改!
[wsl2] processors=8 memory=16GB nestedVirtualization=true kernel=C:\\Users\\<username>\\bzImage
在Windows命令行执行
wsl --shutdown
并重启wsl在Ubuntu中挂载内核模块
sudo modprobe kvm
和sudo modprobe vhost_vsock
以及sudo modprobe kvm_intel
再次检查
kvm-ok
和lsmod
,会发现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并不是一个明智的选择,况且他的渲染并不好。