WSL2 安装并下载、编译AOSP源码

254 阅读6分钟
  1. 安装WSL2

参考链接:安装 WSL

要求 Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)或 Windows 11。

在power shell或cmd执行如下命令。

wsl --install
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
wsl --set-default-version 2

执行完之后就安装了Linux for Windows,并且打开了Windows的虚拟机平台和Linux子系统功能,并设置wsl默认版本为2。

也可以手动安装,先在控制面板中找到启用或关闭Windows 功能,勾选虚拟机平台 和 适用于Linux 的Windows 子系统功能。然后在应用商店找到Linux子系统(例如Ubuntu)进行安装。

如果是升级安装wsl,可能还需要同时升级linux内核。直接下载msi升级安装文件,点击安装即可。具体可参考:旧版 WSL 的手动安装步骤

  1. 硬盘设置

这里分为两类,一是将AOSP源码放在Windows 文件系统下,二是将源码放置在WSL中。

对于前者,需要修改文件目录的大小写敏感,新建完源码目录后,用管理员身份打开WindowsPowershell,执行以下命令:

fsutil.exe file setCaseSensitiveInfo <path> enable

其中的path就是刚新建用来同步AOSP源码的目录,需要注意的是,这个命令只对指定的目录有效,不会改变已存在的子目录的大小写敏感,所以要在同步代码之前设置好。

根据文章:WSL编译AOSP必要的几个前置工作,还需要重新挂载磁盘。

如果源码放在了Windows驱动器上,比如说 F:\aosp ,在WSL中的路径应该是 /mnt/f/aosp 这种形式的,此时需要以drvfs文件系统重新挂载盘符,否则编译到中途会报错:

sudo umount /mnt/f
sudo mount -t drvfs F: /mnt/f -o metadata

注意,每次WSL重启,在编译之前都需要执行这步操作,也可以将它新建成WSL的一个开机服务,确保每次打开WSL都会执行这两段命令。

如果是将源码放置在WSL中,需要注意WSL默认占用C盘空间,保证C盘有足够的空间,或者将WSL迁移到别的盘符。因为我的硬盘没有分区,不用担心占满C盘的空间,所以直接将源码放在WSL中编译。WSL安装之后默认是256GB大小,对于AOSP的编译是不够的。可通过df命令查看容量,下面是我编译完之后的容量,可以看到占用了283GB。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
none            954M  4.0K  954M   1% /mnt/wsl
none            1.9T  527G  1.4T  28% /usr/lib/wsl/drivers
none            954M     0  954M   0% /usr/lib/wsl/lib
/dev/sdc        984G  283G  659G  31% /

扩展 WSL 2 虚拟硬盘的大小

如何管理 WSL 磁盘空间

  1. 使用 wsl.exe --shutdown 命令终止所有 WSL 实例
  2. 查找 Linux 分发版的 .vhdx 文件和磁盘路径
(Get-ChildItem -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss | Where-Object { $_.GetValue("DistributionName") -eq '<distribution-name>' }).GetValue("BasePath") + "\ext4.vhdx"
  1. 使用管理员权限打开 Windows 命令提示符,然后通过输入以下命令打开 diskpart 命令解释器:
  2. Windows 命令提示符复制diskpart,现在会出现一个 DISKPART> 提示。 输入以下命令,将 <pathToVHD> 替换为步骤 2) 中复制的与 Linux 分发 (关联的文件的目录路径 ext4.vhdx 。输入detail vdisk显示与此虚拟磁盘关联的详细信息。
Select vdisk file="<pathToVHD>"
  1. DISKPART> 下输入要分配给此 Linux 发行版的新最大大小的值。需要将 虚拟大小 转换为兆字节。 例如,如果 虚拟大小:1024 GB,则将其转换为 1024000。 而且注意不要分配远高于实际需要的值,因为缩小虚拟磁盘大小的过程要复杂得多。最后exit退出 DISKPART>
expand vdisk maximum=<sizeInMegaBytes>
  1. 启动wsl,执行如下命令
sudo mount -t devtmpfs none /dev
mount | grep ext4

输出如下:

~$ mount | grep ext4
/dev/sdc on / type ext4 (rw,relatime,discard,errors=remount-ro,data=ordered)
/dev/sdc on /mnt/wslg/distro type ext4 (ro,relatime,discard,errors=remount-ro,data=ordered)
/dev/sdc on /snap type ext4 (rw,relatime,discard,errors=remount-ro,data=ordered)
  1. 复制输出的名字,类似于:/dev/sdX。 使用上面的示例,我们将 vhd 大小更改为 1024000,因此命令将为:
sudo resize2fs /dev/sdc 1024000M

经过如上操作,将wsl的虚拟磁盘大小调整到1TB。

  1. 源码下载

创建 bin,并加入 path:

mkdir ~/bin
PATH=~/bin:$PATH

下载 repo:

curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo

下载代码有两种方式,使用每月更新的初始化包或者传统初始化方式

  1. 使用每月更新的初始化包

下载 mirrors.tuna.tsinghua.edu.cn/aosp-monthl…,下载完成后记得根据 checksum.txt 的内容校验一下。

由于所有代码都是从隐藏的 .repo 目录中 checkout 出来的,所以我们只保留了 .repo 目录,下载后解压 再 repo sync 一遍即可得到完整的目录。

使用方法如下:

curl -OC - https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包tar xf aosp-latest.tar
cd AOSP   # 解压得到的 AOSP 工程目录# 这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录
repo sync # 正常同步一遍即可得到完整目录# 或 repo sync -l 仅checkout代码

此后,每次只需运行 repo sync 即可保持同步。

  1. 传统初始化方式

建立工作目录并初始化仓库:

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest

如果需要某个特定的 Android 版本(列表):

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-4.0.1_r1

同步源码树(以后只需执行这条命令来同步):

repo sync

详细可见:

AOSP | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

Android 源码 (AOSP) 下载与编译 - 掘金

  1. 设置WSL内存大小

直接编译源码,会因为内存不足导致失败,通过free -m查看内存,只有4GB内存,swap空间只有2GB。可以通过设置WSL配置文件来修改相关配置属性。

在用户目录下新建.wslconfig文件,在文件管理器输入%USERPROFILE%可找到用户文件夹。注意这里新建.wslconfig文件不要用新建文本文件的方式,这样文件可能没法被正确识别。可以通过命令行输入code .wslconfig的方式。

配置文件如下,根据自己的硬件配置尽可能多的分配多点资源,在编译完成后也能修改回来。我电脑是16GB内存,所以给WSL配置14GB内存,还有32GB swap空间。

# Settings apply across all Linux distros running on WSL 2
[wsl2]

# Limits VM memory to use no more than 4 GB, this can be set as whole numbers using GB or MB
memory=14GB 

# Sets the VM to use two virtual processors
processors=6

# Sets amount of swap storage space to 8GB, default is 25% of available RAM
swap=32GB
  1. 编译源码

编译源码就是常规流程,lunch项根据自己需要进行选择,编译线程数根据机器配置选择。

source build/envsetup.sh
lunch aosp_arm64-eng
make -j4

编译可能会报错缺少库文件,直接安装即可。sudo apt-get install libncurses5

如果需要编译出CMakeLists文件,方便导入CLion,需要在编译前添加环境变量。

export SOONG_GEN_CMAKEFILES=1
export SOONG_GEN_CMAKEFILES_DEBUG=1

编译成功!!

导入Clion效果。

若需要导入Android Studio中,还需要生成配置索引。

  1. 生成 idegen.jar 文件
soruce build/envsetup.sh  

mmm development/tools/idegen/
  1. 源码根目录生成文件android.ipr(工程相关设置), android.iml(模块相关配置)
./development/tools/idegen/idegen.sh

这一步需要Java环境,提前安装一下。sudo apt install openjdk-17-jdk

  1. 然后用Android Studio打开android.ipr文件即可。注意,由于源文件巨大,第一次打开可能会很慢,也可以在android.iml文件中剔除不需要的文件。

最终效果如下: