-
安装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 的手动安装步骤
-
硬盘设置
这里分为两类,一是将AOSP源码放在Windows 文件系统下,二是将源码放置在WSL中。
对于前者,需要修改文件目录的大小写敏感,新建完源码目录后,用管理员身份打开Windows的Powershell,执行以下命令:
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.exe --shutdown命令终止所有 WSL 实例 - 查找 Linux 分发版的 .vhdx 文件和磁盘路径
(Get-ChildItem -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss | Where-Object { $_.GetValue("DistributionName") -eq '<distribution-name>' }).GetValue("BasePath") + "\ext4.vhdx"
- 使用管理员权限打开 Windows 命令提示符,然后通过输入以下命令打开 diskpart 命令解释器:
- Windows 命令提示符复制
diskpart,现在会出现一个DISKPART>提示。 输入以下命令,将<pathToVHD>替换为步骤 2) 中复制的与 Linux 分发 (关联的文件的目录路径ext4.vhdx。输入detail vdisk显示与此虚拟磁盘关联的详细信息。
Select vdisk file="<pathToVHD>"
- 在
DISKPART>下输入要分配给此 Linux 发行版的新最大大小的值。需要将 虚拟大小 转换为兆字节。 例如,如果 虚拟大小:1024 GB,则将其转换为 1024000。 而且注意不要分配远高于实际需要的值,因为缩小虚拟磁盘大小的过程要复杂得多。最后exit退出DISKPART>。
expand vdisk maximum=<sizeInMegaBytes>
- 启动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)
- 复制输出的名字,类似于:
/dev/sdX。 使用上面的示例,我们将 vhd 大小更改为 1024000,因此命令将为:
sudo resize2fs /dev/sdc 1024000M
经过如上操作,将wsl的虚拟磁盘大小调整到1TB。
-
源码下载
创建 bin,并加入 path:
mkdir ~/bin
PATH=~/bin:$PATH
下载 repo:
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
下载代码有两种方式,使用每月更新的初始化包或者传统初始化方式 。
- 使用每月更新的初始化包
下载 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 即可保持同步。
- 传统初始化方式
建立工作目录并初始化仓库:
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
-
设置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
-
编译源码
编译源码就是常规流程,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中,还需要生成配置索引。
- 生成 idegen.jar 文件
soruce build/envsetup.sh
mmm development/tools/idegen/
- 源码根目录生成文件android.ipr(工程相关设置), android.iml(模块相关配置)
./development/tools/idegen/idegen.sh
这一步需要Java环境,提前安装一下。sudo apt install openjdk-17-jdk
- 然后用Android Studio打开android.ipr文件即可。注意,由于源文件巨大,第一次打开可能会很慢,也可以在android.iml文件中剔除不需要的文件。
最终效果如下: