Win 11 通过WSL 安装子系统Ubuntu 20.0.4 进行编译构建Android Aosp 源码

Win 11 通过WSL 安装子系统Ubuntu 20.0.4 进行编译构建Android Aosp 源码

    • 准备工作
    • win11(家庭版) 通过WSL安装 虚拟子系统 ubuntu20.0.4
    • 扩大挂载的虚拟硬盘
    • Swap 扩大处理
        • 针对swap 挂载重启失效的问题做如下处理:
    • 安装更新编译时依赖
    • 拉取代码,编译构建

准备工作

  1. 存放源码的空间大于 400G
  2. 内存不能低于8G, 本地16G
  3. 安装 wsl_update_x64.msi ,处理 Ununtu 安装后无法正常启动,可通过 https://github.com/wxp109761/WSL2 进行下载

win11(家庭版) 通过WSL安装 虚拟子系统 ubuntu20.0.4

  1. 打开电脑 启用或关闭Windows 功能
    额外勾选 Windows 虚拟监控平台适用于Linux的Windows 子系统虚拟机平台,然后点击确定,如图,然后点击确定,进行重启。
    Win 11 通过WSL 安装子系统Ubuntu 20.0.4 进行编译构建Android Aosp 源码_第1张图片

  2. 打开 Microsoft Score应用程序,搜索 WSL, 选择安装ubuntu,我这边选择的是 Ubuntu 20.04.4 LTS,安装完成后如果不想将C盘作为挂载的虚拟硬盘先不要打开 Ubuntu,需要移动 Ubuntu的位置,保存在其他盘,在其他盘进行启动,详见步骤3;如果默认安装在C盘,会默认分配250G 挂载到 Ubuntu
    Win 11 通过WSL 安装子系统Ubuntu 20.0.4 进行编译构建Android Aosp 源码_第2张图片

  3. 管理员模式打开Windows 终端(PowerShell),指令执行如图

    cd C:\Program Files\WindowsApps\  #进入Ubuntu 安装的根目录

    dir CanonicalGroupLimited*  #列出以CanonicalGroupLimited 开头的文件

    dir .\CanonicalGroupLimited.Ubuntu20.04LTS_2004.4.5.0_x64__79rhkp1fndgsc\  #通过tab键补全命名以CanonicalGroupLimited 开头的路径,并罗列该文件夹下所有的子文件,看哪个文件夹包含 ubuntu2004.exe 可执行文件

    mkdir e:\ubuntu20.04 #在对应盘符下创建一个存放ubuntu的路径,我这边在 e 盘下创建了对应的目录

    copy .\CanonicalGroupLimited.Ubuntu20.04LTS_2004.4.5.0_x64__79rhkp1fndgsc\* e:\ubuntu20.04\  #将包含ubuntu2004.exe 文件的文件夹下面的所有文件复制到你所创建的目录,原有的Ubuntu 在Microsoft Score中进行卸载了

Win 11 通过WSL 安装子系统Ubuntu 20.0.4 进行编译构建Android Aosp 源码_第3张图片Win 11 通过WSL 安装子系统Ubuntu 20.0.4 进行编译构建Android Aosp 源码_第4张图片

  1. 双击E:\ubuntu20.04\ubuntu2004.exe 打开Ubuntu(保证wsl_update_x64.msi 已安装,否则会报0x800701bc 错误),按照提示 输入用户名和密码即可。

扩大挂载的虚拟硬盘

SWL默认给虚拟硬盘分配的空间为256G,在后续的源码编译时会提示硬盘空间不够,需要开始时扩大所挂载的虚拟硬盘空间

  1. 找到WSL ubuntu 安装的路径(前面步骤已经移动到e:\ubuntu20.04),即需要找到文件 ext4.vhdx 的位置,管理员模式打开Windows 终端(PowerShell),执行指令
   wsl --shutdown  #终止WSL 实例

   Get-AppxPackage -Name "**" | Select PackageFamilyName #如果不知道 *ext4.vhdx* 的路径,可以用该指令进行检索

   diskpart  #可以对挂载磁盘进行操作
   
   Select vdisk file=""  #pathToVHD代表ext4.vhdx的路径,选择挂载的虚拟盘,本地执行 Select vdisk file="E:\ubuntu20.04\ext4.vhdx"

   detail vdisk  #查看挂载的虚拟盘的大小,默认256G

   expand vdisk maximum=<你需要的大小> #设置你想要的虚拟盘大小,本地执行 expand vdisk maximum=352000

   detail vdisk  #再次查看分配的虚拟盘大小
   
   exit #退出diskpart
  1. 双击 E:\ubuntu20.04\ubuntu2004.exe 打开 WSL 实例,ubuntu 中执行如下指令,进行重新挂载
    df -h  #查看当前的挂载情况

    sudo mount -t devtmpfs none /dev

    mount | grep ext4

    sudo resize2fs /dev/sdX M  #X可能代表a,b,c,sizeInMegabytes代表扩展后的大小,与前面保持一致即可,本地执行sudo resize2fs /dev/sdb 352000M

    df -h 查看分配的虚拟硬盘扩容完成

Swap 扩大处理

虚拟机安装时会默认安装实际物理内存的一半,本地 16G 内存,给虚拟机分配的内存约为8G, 虚拟内存不够,编译时会报错,无法构建成功,需要使用 swap 将部分硬盘当作内存使用。Ubuntu 中执行如下指令。

    free -m  #查看当前 *swap* 的大小

    sudo swapoff /var/swap

    sudo rm /var/swap

    sudo fallocate -l 16G /var/swap

    sudo chmod 600 /var/swap

    sudo mkswap /var/swap

    sudo swapon /var/swap

    sudo vim /etc/fstab  #编辑/etc/fstab 添加如下内容,
        /var/swap  swap  swap  defaults  0  0   

    :: 源码编译构建时可以新开 *Ubuntu* 命令窗口,执行 top 指令,可以查看修改后的 *SWAP*是否被使用,如果未被使用,进行如下处理,最好直接做如下处理
    sudo vim /etc/sysctl.conf  #编辑/etc/sysctl.conf ,当内存剩余设定值时启用 *SWAP*, 
        vm.min_free_kbytes=1500000   #当内存为1.5G时启用SWAP内存

针对swap 挂载重启失效的问题做如下处理:

每次重启之后执行 sudo swapon /var/swap 指令进行挂载,或按照下面的步骤进行自动挂载

 sudo vim /etc/systemd/system/rc-local.service ##创建systemd的服务脚本
## 在/etc/systemd/system/rc-local.service 中添加如下内容:

[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

[Install]
WantedBy=multi-user.target
sudo vim /etc/rc.local  ## 创建rc.local 文件
### 在rc.local 文件中添加如下内容

#!/bin/sh -e
# 
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# 开机启动的命令
swapon /var/swap ## 开机进行 swap 挂载

exit 0
sudo systemctl enable rc-local.service ## 启动创建的服务

sudo chmod +x /etc/rc.local  ## 给/etc/rc.local 权限

安装更新编译时依赖

    sudo apt update

    sudo apt install python-is-python3   #Ubuntu默认安装python3,编译时会提示没有python,执行该指令处理没有python的情况

    mkdir ~/bin

    PATH=~/bin:$PATH

    curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo  

    chmod a+x ~/bin/repo
    
    sudo apt install apt-file  #检索下是否有libncurse.s0.5,如果没有,安装依赖libncurses5
    sudo apt-file find libncurse.s0.5
    sudo apt install libncurses5

    sudo apt install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip  ## 安装需要的依赖包

拉取代码,编译构建

  1. Ubuntu 命令窗口创建存放源码的路径,进入到源码路径下执行如下指令
    git config --global user.name "xxxxxxx"

    git config --global user.email "[email protected]"

    repo init -u https://android.googlesource.com/platform/manifest  #官方初始化基线,由于墙无法正常初始化,使用下面的指令进行初始化

    repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest  #中科大镜像源,如果提示无法连接到 gerrit.googlesource.com,可以执行 vim ~/bin/repo 编辑该文件,将 REPO_URL 的链接替换为: REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'
    
    repo sync #同步代码,末尾可以加 -jX,eg:repo sync -j4  X代表同步代码时开辟的线程数,建议不要 repo sync -j4

    ::代码同步完成后,进行编译构建
    . build/envsetup.sh  #或者 source build/envsetup.sh
    lunch  #lunch后会罗列所有的分支,输入序号选择你要编译的分支,或者直接 lunch <分支名>;本地执行 lunch aosp_x86_64-eng
    make -j12  #进行编译,建议不要过大,make -j8
  1. 编译报错OOM ,进行如下操作
    vim /build/soong/java/droidstubs.go,搜索“cmd.BuiltTool(“metalava”)”定位到代码处,然后新加语句: Flag(“-J-Xmx6114m”).
    如果编译过程中其他报错,多进行几次编译,最后应该就能构建成功了
    Win 11 通过WSL 安装子系统Ubuntu 20.0.4 进行编译构建Android Aosp 源码_第5张图片
    如有侵权,请联系处理,感谢

你可能感兴趣的:(Android,ubuntu,linux,windows,android)